Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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#为struct error的属性赋值_C#_Structure - Fatal编程技术网

C#为struct error的属性赋值

C#为struct error的属性赋值,c#,structure,C#,Structure,我有以下代码(简化),一个结构和一个类 public struct pBook { private int testID; public string request; public string response; public Int32 status; public int test_id { get { return testID; } set

我有以下代码(简化),一个结构和一个类

public struct pBook
{
    private int testID;

    public string request;
    public string response;
    public Int32 status;
    public int test_id
    {
        get
        {
            return testID;
        }
        set
        {
            testID = value;
        }
    }
};

public class TestClass
{
    public static void Main(string[] args)
    {
        pBook Book1;
        pBook Book2;

        Book1.request = "a";
        Book2.response = "b";
        Book2.status = 201;
        Book2.test_id = 0;  //this doesn't work, why?
    }
}
在声明中

Book2.test_id = 0;
我得到了错误

未分配局部变量“Book2”的使用

如何更正?

在“确定赋值”中,
结构
要求在调用方法之前分配所有字段,而属性(甚至属性设置器)都是方法。懒散的解决方案很简单:

var Book2=默认值(pBook);
//其余不变
它通过显式地将所有设置为零来愚弄明确的赋值。然而!在我看来,真正的解决办法是“没有可变结构”。易变结构会伤害你。我建议:

var Book2=新的pBook(“a”、“b”、201、0);
使用(注意:这使用了最新的C#语法;对于较旧的C#编译器,您可能需要进行一些调整):

公共只读结构书
{
公共图书(字符串请求、字符串响应、int状态、int测试ID)
{
请求=请求;
响应=响应;
状态=状态;
TestId=TestId;
}
公共字符串请求{get;}
公共字符串响应{get;}
公共int状态{get;}
public int TestId{get;}
};

区别在于
test\u id
是一个属性,因此这实际上是一个方法调用,而其他赋值仅访问字段。但对我来说,这感觉不一致,错误也应该出现在其他作业中,或者根本不出现。您将其作为私有测试id。私有访问是最不允许的访问级别。私有成员只能在类或结构体中访问。->我认为两个“重复”问题会被严重地选择,因为它们不处理<代码>结构> /代码>场景。此副本确实涉及结构:@PeterB已理解,回想起来,我同意。给您带来的不便我深表歉意。非常感谢您(也谢谢您的建议)。因此,我保持阅读能力,并且作为一个“集合”,我使用公共书籍(字符串…等等,对吗?@Nick:对。对于不可变的结构,您不会更改单个字段。您可以使用不同的结构替换整个结构。同样,当您将3添加到2时,您不会将2或3更改为5。2和3保留为2和3;您会生成一个新值。结构是值类型,因此您应该将它们视为值,而不是可变的如果你发现自己想要更改不可变结构上的单个字段,一个常见的解决方法是添加一个流畅的接口来完成。例如,
book=book.WithStatus(5);
或者,一个通用函数可以工作(例如,
book=book.With(Status:5);
)。这些函数(可选地实现为扩展方法)只是对构造函数的简单调用。