c#访问其他类上私有常量的正确方法

c#访问其他类上私有常量的正确方法,c#,encapsulation,C#,Encapsulation,如果我有课 public class Person { private const string MyConst = "SomeValue"; [MyAttribute(MyConst)] public string Name {get;set;} } 在另一个类中,我想访问MyConst什么是最好的方法,保持所有的封装?它是正确的Person类吗?创建一个公共属性,返回MyConst 公共字符串MyPublicConst{get{return MyConst;}pr

如果我有课

public class Person
{
    private const string MyConst = "SomeValue";

    [MyAttribute(MyConst)]
    public string Name {get;set;}
}

在另一个类中,我想访问
MyConst
什么是最好的方法,保持所有的封装?它是正确的Person类吗?

创建一个公共属性,返回MyConst


公共字符串MyPublicConst{get{return MyConst;}private set;}
-但为什么要这样做?

您可以将其公开(Duh!),如果您计划将其从常量更改为其他内容,可以使用属性来封装它,或者您可以使用一种方法将其返回给您。

这完全取决于您对MyConst所需的保护。如果除了Person之外,没有任何主体能够读取或写入此属性,那么您不应该通过Get或Set方法公开它。如果每个人都能读但不能写,那么您可以通过只读属性公开它。如果只有一个类(例如ClassB)可以读取它,那么您可以亲自提供一个函数,该函数接受ClassB对象并将私有常量传递给它:

public class ClassB
{
    private string ConstValue {get; set;}
    public void SetConstValue(string constValue)
    {
       ConstValue = constValue;
    }

    public void GetConstFromPerson(Person p)
    {
       p.GetConstValue(this);
    }
}


public class Person
{
   private const string MyConst = "A";


   public void GetConstValue(ClassB obj)
   {
       //todo: contract validations
       obj.SetConstValue(MyConst);
   }

}
[编辑]


另一种解决方案是将常量定义为内部常量,并且程序集中只有Person和CLassB如果您希望从另一个类访问MyConst,则不再封装它。围绕此添加属性或方法调用并不意味着它是封装的。这是一个常数。它不能改变。所以它要么是公开的,要么不是。如果另一个类需要访问,请将其设置为内部类或公共类

其他任何事情都介于拒绝和代码气味之间

class Encapsulation{ 
            private string a;

            public string AccessValue(){

                return a;
            }
         }
我想你可以对任何变量这样做,当然是简单的变量

这是来自同一类的公共方法,该类返回私有字符串的相同值。 通过这种方式,您可以从类外部获取值,而无需将其声明为public

要从另一个类访问它,您只需编写:

class Player{ string b = Encapsulaion.AccessValue()}

公共字符串名称{get{return MyConst;}};你为什么要封装它,它的
常量
,你不能设置它,你只能读取它。就这样吧,那我就把它公之于众?然后在另一个类中创建person的实例,然后访问
MyConst
,如果您在类之外公开了某些内容,则它不再是私有的。如果它需要在其他地方使用,也许将它作为班级的私人成员不是最好的设计。@cMinor-要提出一个有教育意义的建议,你必须准确地解释你试图实现的目标。最好只是将其公开。常数的一个属性有点傻。@AlexBeisley hehe是的,我的解决方案现在看起来很傻,你已经提到了。它是一个常数。通过只读属性公开它能实现什么?