我有一个非常不可能的,原来的情况,想从我的财产返回一个只读数组。 到目前为止,我只知道一种方法 – 通过System.Collections.ObjectModel.ReadOnlyCollection<T> 。 但是这对我来说似乎有些尴尬, 更不用说这个类失去了通过索引来访问数组元素的能力 ( 增加了:哎呀,我错过了索引器 )。 有没有更好的办法? 有什么可以使数组本身不可变?
简洁版本: C#代码 typeof(string).GetField("Empty").SetValue(null, "Hello world!"); Console.WriteLine(string.Empty); 编译运行时,输出"Hello world!" 在.NET 4.0和更低版本下,但在.NET 4.5和.NET 4.5.1下给出了"" 。 如何可以忽略写入字段,或谁重置此字段? 更长的版本: 我从来没有真正理解为什么string.Empty字段(也称为[mscorlib]System.String::Empty )不是const (又名literal ),请参阅“ 为什么不是String.Empty常量? ”。 这意味着,例如,在C#中我们不能在以下情况下使用string.Empty : 在case string.Empty:的switch语句中case string.Empty: 作为可选参数的默认值,如void M(string x = string.Empty) { } 应用属性时,如[SomeAttribute(string.Empty)] 其他需要编译时常量的情况 这对有关是否使用string.Empty或""的众所周知的“宗教战争”有影响,请参阅“ 在C#中,我应该使用string.Empty还是String.Empty或”“来intitialize一个string? 几年前,我通过反思将Empty设置为其他string实例,并且看到BCL中有多less部分开始因为它而奇怪地行为。 这是相当多的。 Empty引用的变化似乎在应用程序的整个生命周期中一直存在。 现在,有一天我试着重复那个小小的特技,但是后来使用了一个.NET 4.5的机器,我不能再这样做了。 (注意!如果你的机器上有.NET 4.5,可能你的PowerShell仍然使用旧版本的.NET,所以试试copy- [String].GetField("Empty").SetValue($null, "Hello world!")到PowerShell中以查看更改此引用的一些效果。) 当我试图寻找这个原因时,我偶然发现了一个有趣的线程“ .NET 4.5 beta中这个FatalExecutionEngineError的原因是什么? ”。 在这个问题的接受答案中,是否注意到通过4.0版本, System.String有一个静态构造函数.cctor ,其中设置了Empty字段(在C#源代码中,当然可能只是字段初始值设定项)而在4.5中不存在静态构造函数。 […]
我有一些.csv文件,我正在使用它作为testing平台的一部分。 我可以打开它们,没有任何问题的阅读, 除非我已经在Excel中打开文件,在这种情况下,我得到一个IOException : System.IO.IOException:进程无法访问文件“TestData.csv”,因为它正在被另一个进程使用。 这是testing台上的一个片段: using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read)), false)) { // Process the file } 这是StreamReader的限制吗? 我可以在其他应用程序(例如记事本+ +)中打开文件,所以它不能是一个操作系统的问题。 也许我需要使用一些其他类? 如果有人知道我可以绕过这个(除了closuresexcel!),我会非常感激。
我有一些通过SSH远程访问的git仓库,我想让其中一些只读,以防止更多的推动。 有些人有遥控器指向这些存储库。 这些裸存储库初始化–shared=group ,所以是设置文件权限为660所有文件足够好,仍然允许SSH访问,但不允许写入? 还是有更简单的方法? 干杯。
我正在考虑使用Tuple类来存储我的程序中需要的2个整数信息(StartAddress,EndAddress)。 但是我发现Tuple项目只是ReadOnly,所以如果我需要为一个项目设置一个值,我需要重新实例化一个Tuple。 这个devise决定背后的原因是什么?
我不知道什么时候属性应该是私人的,如果我应该使用财产。 我最近读到setter和getters不pythonic,我应该使用属性装饰。 没关系。 但是,如果我有属性,不能从课外设置,但可以读取(只读属性)。 如果这个属性是私人的,私人的,我指的是下划线,就像self._x ? 如果是的话,我怎样才能读取它,而不使用getter? 我现在唯一知道的方法是写 @property def x(self): return self._x 这样我可以通过obj.x读取属性,但我不能设置它obj.x = 1所以没关系。 但是,我真的应该关心设置不能设置的对象吗? 也许我应该离开它。 但是再次我不能使用下划线,因为读取obj._x对于用户obj._x很奇怪,所以我应该使用obj.x ,然后用户不知道他不能设置这个属性。 你的意见和实践是什么?
有没有一种简单的方法来创build一个不可变的NumPy数组? 如果必须从ndarray派生一个类来做到这一点,那么为了实现不可变性,必须重写的最小方法是什么?
我发现人们声称,在类中使用所有只读字段并不一定会使该类的实例不可变,因为即使在初始化(构造)之后,也有“方法”更改只读字段值。 怎么样? 什么方法? 所以我的问题是什么时候我们真的可以在C#中有一个“真正的”不可变的对象,我可以安全地在线程中使用? 也做匿名types创build不可变的对象? 有人说LINQ在内部使用不可变对象。 究竟如何?
我有几个常量,我使用,我的计划是把他们在一个双数的常量数组,但编译器不会让我。 我试过这样的声明: const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 }; 然后我决定把它声明为static: static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; 但问题依然存在。 为什么编译器不能让我声明一个常量值数组? 还是会的,我只是不知道如何?
我需要在我的types上实现只读属性。 此外,这个属性的值将在构造函数中设置,它不会被改变(我正在写一个暴露WPF自定义路由UI命令的类,但没关系)。 我看到两种方式来做到这一点: class MyClass { public readonly object MyProperty = new object(); } class MyClass { private readonly object my_property = new object(); public object MyProperty { get { return my_property; } } } 由于所有这些FxCop的错误说,我不应该有公共成员variables,看来,第二个是正确的方法来做到这一点。 正确? 在这种情况下,获取唯一属性和只读成员之间是否有区别? 我会很感激任何意见/build议/等。