C# 指定给属性无效
我有一些类似这样的代码C# 指定给属性无效,c#,properties,C#,Properties,我有一些类似这样的代码 public class SomeClass { public string Value {get;set;} public string DisplayValue { get { if (fieldType == "ImageUri") { FileInfo file = new FileInfo(Value); return
public class SomeClass
{
public string Value {get;set;}
public string DisplayValue
{
get
{
if (fieldType == "ImageUri")
{
FileInfo file = new FileInfo(Value);
return Path.Combine(file.Directory.Name, fileName);
}
else
{
return Value;
}
}
set {}
}
}
“get”可以正常工作,但我无法更改DisplayValue。当我指定一个新值时,它不会被更新。SomeClass.DisplayValue=“somethinew”不起作用。有人知道为什么吗?您实际上需要定义一个setter:
public string DisplayValue
{
get
{
// some logic
return Value;
}
set
{
// some logic
Value = value;
}
}
请注意,此处的关键字表示赋值语句右侧的结果(与标识符值
相反,后者是对您定义的其他属性的引用)
进一步阅读
public string DisplayValue
{
get
{
// some logic
return Value;
}
set
{
// some logic
Value = value;
}
}
请注意,此处的关键字表示赋值语句右侧的结果(与标识符值
相反,后者是对您定义的其他属性的引用)
进一步阅读
- 您的setter是空的,因此当然不会发生任何事情。您写入的属性实际上是只读的
public string DisplayValue
{
get
{
---some logic
return Value;
}
set { Value = value; }
}
如果需要,则将backing字段设置为
值
关键字。您可能对自动属性语法感到困惑,该语法对您隐藏了这一点(您用它声明了Value
)。手动声明属性时,您必须声明整个属性。任何“自动性”都将丢失。您的setter为空,因此当然不会发生任何事情。您写入的属性实际上是只读的
public string DisplayValue
{
get
{
---some logic
return Value;
}
set { Value = value; }
}
如果需要,则将backing字段设置为
值
关键字。您可能对自动属性语法感到困惑,该语法对您隐藏了这一点(您用它声明了Value
)。手动声明属性时,必须声明整个属性任何“自动性”都将丢失。我解决了我的问题,如下所示:
public class SomeClass
{
private string _displayValue;
public string Value {get;set;}
public string DisplayValue
{
get
{
if (string.IsNullOrEmpty(_displayValue))
{
if (fieldType == "ImageUri")
{
FileInfo file = new FileInfo(Value);
return Path.Combine(file.Directory.Name, fileName);
}
else
{
return Value;
}
}
else
{
return _displayValue;
}
}
set {_displayValue = value;}
}
}
我解决了我的问题如下:
public class SomeClass
{
private string _displayValue;
public string Value {get;set;}
public string DisplayValue
{
get
{
if (string.IsNullOrEmpty(_displayValue))
{
if (fieldType == "ImageUri")
{
FileInfo file = new FileInfo(Value);
return Path.Combine(file.Directory.Name, fileName);
}
else
{
return Value;
}
}
else
{
return _displayValue;
}
}
set {_displayValue = value;}
}
}
谢谢,但我不想改变“值”。这是需要保持不变的原始值。不过你确实回答了我的问题,所以谢谢你!我必须改变我的逻辑,这样显示值可以改变,但“值”保持不变。@LacHo,我觉得这看起来有点奇怪。很高兴我能帮忙!是的,我没有复制所有的代码,所以看起来确实很奇怪。“getter”可以返回值以外的值,或者在某些情况下返回原始值。@LacHo有很多方法可以解决这个问题,但是如果不知道“某些逻辑”是什么,就很难提供具体的方向。如果有人调用
obj.Value=“foo”
,那么在这种情况下,obj.DisplayValue
将返回“foo”
,具体会发生什么?如果用户调用obj.DisplayValue=“foo”
将obj.DisplayValue
返回原始值,这是否总是“覆盖”DisplayValue
的原始值(但保持value
不变)?我更新了代码,以便您可以看到。getter比这个长,但是我展示了两个案例,所以你有了一个想法。绝对不应该更改对象值。谢谢,但我不想更改“值”。这是需要保持不变的原始值。不过你确实回答了我的问题,所以谢谢你!我必须改变我的逻辑,这样显示值可以改变,但“值”保持不变。@LacHo,我觉得这看起来有点奇怪。很高兴我能帮忙!是的,我没有复制所有的代码,所以看起来确实很奇怪。“getter”可以返回值以外的值,或者在某些情况下返回原始值。@LacHo有很多方法可以解决这个问题,但是如果不知道“某些逻辑”是什么,就很难提供具体的方向。如果有人调用obj.Value=“foo”
,那么在这种情况下,obj.DisplayValue
将返回“foo”
,具体会发生什么?如果用户调用obj.DisplayValue=“foo”
将obj.DisplayValue
返回原始值,这是否总是“覆盖”DisplayValue
的原始值(但保持value
不变)?我更新了代码,以便您可以看到。getter比这个长,但是我展示了两个案例,所以你有了一个想法。绝对不应更改对象值。