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比这个长,但是我展示了两个案例,所以你有了一个想法。绝对不应更改对象值。