例如,如果我们的类MyClass具有私有字段。是否可以通过类对象设置值。
public class MyClass { private int field; }
public class Program
{
public static void Main()
{
MyClass cl = new MyClass();
cl = 10; // set value
}
}
答案 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;
}
}