Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法修改结构成员_C#_Struct - Fatal编程技术网

C# 无法修改结构成员

C# 无法修改结构成员,c#,struct,C#,Struct,我对编程一点也不陌生,但我对C#structs的理解似乎有一个漏洞 有人能解释一下为什么下面的代码会打印出下面的内容吗 区1:0,区2:0 struct是值类型-因此,当您访问distance.Dist1.SetFeet时,您基本上是在访问副本。。。参见MSDN中的示例 [评论后编辑] 如果您执行Distance.Dist1=新距离().SetFeet(1000)并将SetFeet的返回值从void更改为Distance应该可以工作。或者将Distance设置为一个类 有关如何以预期的方式构建结

我对编程一点也不陌生,但我对C#structs的理解似乎有一个漏洞

有人能解释一下为什么下面的代码会打印出下面的内容吗

区1:0,区2:0


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();
    }
}