我有点挂在C#结构上。我有以下代码提取(抱歉质量 - 我尽可能减少):
namespace Generics
{
public struct Generic
{
public struct Traverse
{
public double TraverseWidth, CurrentPosition;
}
}
public class XXXSettings
{
private Generics.Generic.Traverse _TRAVERSE;
public Generics.Generic.Traverse TraverseData
{
get { return _TRAVERSE; }
set { this._TRAVERSE = TraverseData; }
}
public XXXSettings()
{
_TRAVERSE = new Generics.Generic.Traverse() { CurrentPosition = 0, TraverseWidth = 0 };
}
}
}
namespace XXX_Driver
{
public class XXXClient
{
private Generics.XXXSettings _Settings;
public Generics.XXXSettings Settings
{
get { return _Settings; }
set { this._Settings = Settings; }
}
public bool Connect()
{
if (this.Settings == null)
{
throw new ArgumentNullException();
}
Settings.TraverseData.TraverseWidth = "1234";
}
}
}
我的问题:最后一行代码
Settings.TraverseData
标记为“XXXSettings.TraverseData的返回值无法更改,因为它不是变量。”
但为什么会这样呢?我习惯从VB.NET结构而不知道这种行为?!
即使
_Settings.TraverseData.TraverseWidth = new Generics.Generic.Traverse() { TraverseWidth = 1234, CurrentPosition = 0 };
无济于事。 C#中的结构至少有用吗?我认为这是一个价值集团,但如果它们无法访问?!
感谢您提供一些解释和一些提示,我应该如何更改代码:)
答案 0 :(得分:3)
实际上,TraverseData
不是变量:
public Generics.Generic.Traverse TraverseData
{
get { return _TRAVERSE; }
set { this._TRAVERSE = TraverseData; } // Mistake is here !!
}
使用value
关键字检索实际设定值:
public Generics.Generic.Traverse TraverseData
{
get { return _TRAVERSE; }
set { this._TRAVERSE = value; }
}
答案 1 :(得分:2)
structs
不要按照您的预期行事。它们是不可变的。
var myStruct = new Struct { Name = "Rob", Gender = "m" };
myStruct.Name = "Test";
此代码使用Name" Rob"创建一个结构。然后,它创建一个 new 结构,将值复制到Name
除外,它设置为Test
。
现在,您遇到此错误的原因是因为您使用的是属性,而不是字段或变量。 .NET只执行此操作“复制和替换”#39;自动变量。
有两种方法可以修复您的代码...使用字段(不是最佳方法):
public Generic.Traverse TraverseData;
或者,使用class
代替struct
- 此方法可能更适合您。
谨慎使用结构。改变结构的属性几乎不是一个好主意,它们意味着不可变。而且,虽然您正在学习C#
,但您不太可能需要使用结构而不是类。
VB具有相同的行为,如下所示:
Sub Main
Dim a as A
a = new A()
a.Prop2.Name = "A"
End Sub
Structure Test
public Name as String
End Structure
Class A
public property Prop2 As Test = new Test()
End Class
给出错误
表达式是一个值,因此不能作为赋值的目标。
将其更改为public Prop2 As Test = new Test()
(或使用类而不是struct)按预期工作。