C# 无法修改结构成员
我对编程一点也不陌生,但我对C#structs的理解似乎有一个漏洞 有人能解释一下为什么下面的代码会打印出下面的内容吗 区1:0,区2:0C# 无法修改结构成员,c#,struct,C#,Struct,我对编程一点也不陌生,但我对C#structs的理解似乎有一个漏洞 有人能解释一下为什么下面的代码会打印出下面的内容吗 区1:0,区2:0 struct是值类型-因此,当您访问distance.Dist1.SetFeet时,您基本上是在访问副本。。。参见MSDN中的示例 [评论后编辑] 如果您执行Distance.Dist1=新距离().SetFeet(1000)并将SetFeet的返回值从void更改为Distance应该可以工作。或者将Distance设置为一个类 有关如何以预期的方式构建结
struct是值类型-因此,当您访问
distance.Dist1.SetFeet
时,您基本上是在访问副本。。。参见MSDN中的示例
[评论后编辑]如果您执行
Distance.Dist1=新距离().SetFeet(1000)
并将SetFeet
的返回值从void
更改为Distance
应该可以工作。或者将Distance
设置为一个类
有关如何以预期的方式构建结构的参考,请参见框架中的DateTime
struct-[/EDIT after comment]getter和setter——属性的访问方式——在这方面仍然与方法类似。就是
distances.Dist1.SetFeet(1000);
是“等同于”吗
结构(值)的“复制”是在从getter返回(或传递给setter)时进行的。如果Dist1
是一个成员变量,则情况并非如此,它将“按预期”工作
愉快的编码。属性与变量的处理方式不同,只需从距离声明中删除
{get;set;}
,代码即可正常工作
struct Distance
{
public void SetFeet(int feet) { Value = feet; }
public void SetMiles(float miles) { Value = (int)(miles * 5280f); }
public int GetFeet() { return Value; }
public float GetMiles() { return Value / 5280f; }
private int Value;
}
class Distances
{
public Distance Dist1;//here
public Distance Dist2;//and here
}
class Program
{
static void Main(string[] args)
{
Distances distances = new Distances();
distances.Dist1.SetFeet(1000);
distances.Dist2.SetFeet(2000);
Console.WriteLine("Dist1: {0}, Dist2: {1}", distances.Dist1.GetMiles(),
distances.Dist2.GetMiles());
Console.ReadLine();
}
}
我知道结构是值类型。但我不知道
distance.Dist1.setfeets()
是如何复制的。复印件在哪里?你能详细说明一下吗?刚刚添加了一个指向MSDN的链接,其中的示例与你的类似,访问“distance.Dist1”会给你一个值(不是参考)。。。这是字段Dist1的副本-然后在该副本上调用setFoots。。。将结构更改为类,并立即查看它是否工作(因为这样您就可以得到一个引用)好的,我现在就知道了。谢谢似乎有点尴尬--我不能使用您建议的代码,因为SetFeet()
不返回可以分配给Dist1的值。添加了对DateTime的引用作为结构实现的示例,并更正了分配(将结构的所有“修改方法”的返回类型从void更改为Distance)…这就是为什么使用可变结构不是一个好主意的原因。@Jeff:好吧,但是当有多种解释参数的方法时,如何实现代码来为该结构赋值呢?(在我的例子中,我想我可以指定一个int
或float
,并将它们分别解释为英尺和英里,但我的真实代码有更多的方法来解释基础值。)使其不可变。与中一样,不要使更改存储在结构中的值成为可能。查看框架中现有值类型的公共接口以及它们如何处理“不断变化的值”。请参阅:DateTime
,String
,KeyValuePair
。如果Yahia的不满意,我可以补充一个答案。
distances.GetDist1().SetFeet(1000);
struct Distance
{
public void SetFeet(int feet) { Value = feet; }
public void SetMiles(float miles) { Value = (int)(miles * 5280f); }
public int GetFeet() { return Value; }
public float GetMiles() { return Value / 5280f; }
private int Value;
}
class Distances
{
public Distance Dist1;//here
public Distance Dist2;//and here
}
class Program
{
static void Main(string[] args)
{
Distances distances = new Distances();
distances.Dist1.SetFeet(1000);
distances.Dist2.SetFeet(2000);
Console.WriteLine("Dist1: {0}, Dist2: {1}", distances.Dist1.GetMiles(),
distances.Dist2.GetMiles());
Console.ReadLine();
}
}