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);
)。这些函数(可选地实现为扩展方法)只是对构造函数的简单调用。