C#无法更改返回值
本文关键字:返回值 | 更新日期: 2023-09-27 18:20:50
我对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#中的structs至少有什么用处吗?我以为这是一个价值观的集合体,但如果它们不可访问?!
感谢您的解释和提示,我应该如何更改代码:)
实际上,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; }
}
structs
的行为与您预期的不同。它们是不可变的。
var myStruct = new Struct { Name = "Rob", Gender = "m" };
myStruct.Name = "Test";
这段代码创建了一个名为"Rob"的结构。然后,它创建一个新的结构,复制除Name
之外的值,并将其设置为Test
。
现在,出现此错误的原因是您使用的是属性,而不是字段或变量。NET仅对变量自动执行此"复制并替换"操作。
有两种方法可以修复代码。。。使用字段(不是最佳方法):
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()
(或使用类而不是结构)可以按预期工作。