不同类中的C#私有集属性

不同类中的C#私有集属性,c#,.net,C#,.net,我需要用私有集定义属性。我是否可以在不同的类(在同一个.cs文件中)中设置此属性?我在课外访问该属性时遇到问题 例如 私有集等同于下面的代码 private int myProperty; public int MyProperty { get { return myProperty; } } 因此,不能在类之外设置属性。只能在嵌套类和派生类中进行设置 虽然你也可以使用反射 引用:唯一的方法是在ClassA中创建一个设置属性的方法 public class ClassA { p

我需要用私有集定义属性。我是否可以在不同的类(在同一个.cs文件中)中设置此属性?我在课外访问该属性时遇到问题

例如


私有集等同于下面的代码

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}
因此,不能在类之外设置属性。只能在嵌套类和派生类中进行设置

虽然你也可以使用反射


引用:

唯一的方法是在ClassA中创建一个设置属性的方法

public class ClassA
{
    public string ID { get; private set; } = "default id";

    public void SetID(string id) 
    {
        ID = id;
    }
}
public class ClassB
{
    private ClassA _classA = new ClassA();

    public ClassB() 
    {
        Debug.WriteLine(_classA.ID);
        _classA.SetID("some id");
        Debug.WriteLine(_classA.ID);
    }
}
然后从ClassB调用该方法

如果要执行某种形式或形状的验证,或者可能要向属性添加动态构造的值,可以使用这种方法

在这些情况下,你也可以使用“智能财产”,但这也是一个有争议的话题

有时候你不允许改变一个类的接口,然后你必须找到一些方法

如评论中所述,这违背了私人设定者的目的

但是,在某些情况下,您可能希望使用这种方法


<> P>无论如何,这是回答问题。

< p>我相信你在C++中找到了代码<代码>朋友>代码>类,其中给出了两个类:代码< A<代码> >代码> B/CUT>,定义<代码> B<代码> < <代码>朋友> <代码> < <代码> >给出<代码> B<代码>完全访问<代码> A<代码>,以及其他朋友类(如果有的话)。C#中不支持此概念。

private
意味着只能从类内访问,因此,不支持。您还可以标记things
internal
,这意味着可以访问同一程序集中的任何内容如果一个是内部类,那么它可以工作-。@mjwills内部类不在类之外,那么如果没有反射@viveknuna,您就不能进行操作。您可以向ClassA:SetID(string id){id=id}添加一个方法。。。。。。。。然后从类位调用该方法与该代码并不完全等价。由于使用私有setter,类本身可以设置
this.MyProperty
(这是您的“等效”代码所不允许的)。@John I清楚地提到,您不能在类之外进行设置,这意味着您可以在同一个类内进行设置。示例只是为了说明私有集的含义,以帮助OP理解概念私有集并不等同于无setter。。。。。只能从构造函数中设置no setter。。。。。而私有setter可以从包含类中的任何位置设置。所以这个答案是完全错误的。@JonathanAlfaro我的观点是(缺少一个setter,如这个答案所示)没有编译。如果您是指(即自动实现的属性,与此答案不同),那么是的,您是正确的。这是毫无意义的。它违背了让@JonathanAlfaro不再是答案的目的all@viveknuna它实际上回答了一个问题,即如何从另一个类中设置属性。@mjwills如果要设置一个动态值,例如附加后缀或前缀,该怎么办?如果要进行验证,该怎么办?因此,这并非“毫无意义”。当然,你可以使用“智能属性”来实现这一点,但这也是一个有争议的话题,有些人不喜欢“智能属性”。C#中setter的全部目的就是设置属性
SetID
是一种设置ID的Java方式,而不是C#方式。这个答案就像回答“如何在不解锁的情况下进入前门?”和“在前门旁边安装第二个解锁的门”。我的意思是,当然,它是有效的。但它很奇怪,也不惯用,而且首先违背了锁的目的。
public class ClassA
{
    public string ID { get; private set; } = "default id";

    public void SetID(string id) 
    {
        ID = id;
    }
}
public class ClassB
{
    private ClassA _classA = new ClassA();

    public ClassB() 
    {
        Debug.WriteLine(_classA.ID);
        _classA.SetID("some id");
        Debug.WriteLine(_classA.ID);
    }
}