通过课程设置字段

时间:2017-01-22 20:20:02

标签: c# .net

例如,如果我们的类MyClass具有私有字段。是否可以通过类对象设置值。

 public class MyClass { private int field; }

 public class Program
    {
      public static void Main()
      {
        MyClass cl = new MyClass();
        cl = 10; // set value
      }
    }

5 个答案:

答案 0 :(得分:2)

它不像C#那样直接可能,但可以通过从值中实例化类来实现隐式运算符重载。

public class MyClass
{
    private int field;

    public static implicit operator MyClass(int value)
    {
        return new MyClass { field = value };
    }
}

然后您可以使用:

MyClass myClass = 100;

这是你最接近你想要的东西。

除此之外,你只能通过构造函数或反射来实现。

答案 1 :(得分:0)

没有。但是您可以公开一个设置值的方法。

private int _field;

public void SetMyPrivateField(int val) 
{
   _field = val;
}

或者您可以使用构造函数

传递值
public class MyClass 
{
   private int _field;

   public MyClass(int val) 
   {
       _field = val;
   }
}

答案 2 :(得分:0)

  

是否可以通过类对象设置值。

使用反射确实可能

public class Program
{
    public static void Main()
    {
        MyClass cl = new MyClass();
        var fi = cl.GetType().GetField("field", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        fi.SetValue(cl, 10);

        Console.WriteLine(fi.GetValue(cl));
    }
}

但是这个领域可能是私有的,所以你不应该这样做。但你可以

答案 3 :(得分:0)

这违反了C#中使用的面向对象的概念 所以,你不应该这样做并保存封装概念 使用

  • 属性

     public Get{get=>field;set=>field=value;}
    
  • Setter&吸气剂

  • 构造

    public MyClass(int field) {this.field = field;}
    

答案 4 :(得分:0)

这实际上取决于您想要使用多少封装。实际上,考虑这个问题的最佳方法是尽可能地限制变量的可访问性。

您希望变量/属性在类

之外读/写

使用公共财产。这为您提供了读写访问权限。不需要支持变量,因为它无论如何都是可读/可写的。

public MyClass
{
    public int Field {get; set;}
}

您希望变量/属性在类外可读,但不可写

有两种方法可以让猫在这里去皮。一种方法是仍然使用属性但将setter设为私有,这意味着它只能在类中设置。

public MyClass
{
    public int Field {get; private set;}

    public MyClass(int field)
    {
        Field = field;
    }
}

如果只是在构造函数中设置它并且永远不会改变,我更喜欢有一个后备只读变量。

public MyClass
{
    private readonly int _field;
    public int Field {get=>_field;}

    public MyClass(int field)
    {
        _field = field;
    }
}

您希望将变量传递给类但不能从该点读取/写入

您应该只使用私有只读变量。

public MyClass
{
    private readonly int _field;

    public MyClass(int field)
    {
        _field = field;
    }
}