我已经阅读了几篇关于不变性的文章,但仍然没有很好地遵循这个概念.
我最近在这里提到了一个线程,提到了不变性,但由于这本身就是一个话题,我现在正在制作一个专门的线程.
我在过去的帖子中提到过,我认为不变性是将对象设为只读并使其可见性低的过程.另一位成员表示,这与此没有任何关系.此页面(系列的一部分)使用不可变类/结构的示例,它使用readonly和其他概念将其锁定.
在这个例子中,状态的定义究竟是什么?国家是一个我没有真正掌握的概念.
从设计指南的角度来看,一个不可变的类必须是一个不接受用户输入并且真的只返回值的类?
我的理解是,任何只返回信息的对象都应该是不可变的并且"锁定",对吧?因此,如果我想在具有该方法的专用类中返回当前时间,我应该使用引用类型,因为它将工作类型的引用,因此我受益于不变性.
// x is compiled as an int
var x = 10;
// y is compiled as a string
var y = "Hello";
// z is compiled as int[]
var z = new[] { 0, 1, 2 };
Run Code Online (Sandbox Code Playgroud)
但
// ano is compiled as an anonymous type
var ano = new { x1 = 10, y1 = "Hello" };
Run Code Online (Sandbox Code Playgroud)
ano创建的对象属性是只读的.我想弄清楚为什么这些属性是只读的.建议表示赞赏?
编辑:
var ano1 = new { x1 = 10, y1 = "Hello" };
var ano2 = new { x1 = …Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么 C# 中匿名类型的属性是只读的?
我写了这样的东西,
var suspense = new { Name = "Android", Market = string.Empty };
suspense.Market = "Potential";
Run Code Online (Sandbox Code Playgroud)
.NET 抛出错误
无法分配属性或索引器“AnonymousType#1.Market”——它是只读的
我知道 C# 中的 AnonymousType 是不可变的,但为什么呢?这是由于 CLR 的某些限制吗?
我可以使用下面的代码轻松创建一个匿名类。但是我不能写它。有没有办法可以写入某种未命名的类?
var test = new { a = 5, b = "sz" };
test.a++;
Run Code Online (Sandbox Code Playgroud) 我需要序列化OpenTK.Vector2包含带有getter但没有setter的属性的objects().我希望一般可以忽略这些属性,否则我最终会从具有两个相关数据(X和Y)的对象中充分夸大JSON .
代码:
JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
Vector2 v = new Vector2 { X = 1, Y = 0 };
string json = JsonConvert.SerializeObject(v, settings);
Run Code Online (Sandbox Code Playgroud)
生成字符串:
{
"X" : 1.0,
"Y" : 0.0,
"Length" : 1.0,
"LengthFast" : 1.0016948,
"LengthSquared" : 1.0,
"PerpendicularRight" : {
"X" : 0.0,
"Y" : -1.0,
"Length" : 1.0,
"LengthFast" : 1.0016948,
"LengthSquared" : 1.0,
"PerpendicularRight" : {
"X" : -1.0,
"Y" : …Run Code Online (Sandbox Code Playgroud) 这里的上下文是我为DataGridView使用一种特殊的DataSource,这是一种匿名类型,可以按如下方式创建:
var data = new[] { new { A = "A", B = 1 }, new { A = "B", B = 2 }, new { A = "C", B = 3 }};
Run Code Online (Sandbox Code Playgroud)
问题是如果我将上述数据源用于DataGridView,我无法通过单击其单元格来编辑DataGridView的内容.
myDataGridView.DataSource = data;
Run Code Online (Sandbox Code Playgroud)
你能否向我解释为什么以及如何使其可编辑?或者只是我们不能这样做?
非常感谢您的帮助.
在这个例子中:
var p1 = new {Name = "A", Price = 3};
Run Code Online (Sandbox Code Playgroud)
这转化为IL:
class __Anonymous1
{
private string name ;
private int price;
public string Name{ get { return name; } set { name = value ; } }
public int Price{ get { return price; } set { price= value ; } }
}
__Anonymous1 p1 = new __Anonymous1();
p1.Name = "A";
pt.Price =3
Run Code Online (Sandbox Code Playgroud)
根据IL,它是允许的,为什么会这样?它背后的决定是什么?不应该只读?
谢谢
这是我的第一个问题,温柔.