c#如何将静态类分配给实例变量?

时间:2019-09-09 08:30:55

标签: c# static instance

不能使用实例调用静态成员,例如instance.myStaticProperty

有什么办法可以使实例变量成为静态自类的别名吗?喜欢:

class myClass
{
    public string a ="hello";
    public static string b ="world";

    public myClass myVariable = global::myClass;   // <--- phseudo code
}

我可以打电话给

myClass instance= new myClass();
instance.myVariable.b; //

3 个答案:

答案 0 :(得分:2)

不,没有。最接近的是使用using

您的静态类定义:

class ClassA
{
    public static string A = "A";
}

并使用它:

using StaticClassA = ConsoleApp1.ClassA;

class Program
{
    static void Main(string[] args)
    {
        string a = StaticClassA.A;
    }
}

虽然收获不多,但是可以稍微简化您的命名。

另一个(有点酷)的选项是static using

using static ConsoleApp1.StaticClassA;

class Program
{
    static void Main(string[] args)
    {
        string a = A;
    }
}

答案 1 :(得分:1)

您正在尝试在其中进行反模式。

静态属性是未在该类的实例(对象)中定义的属性,而是由类本身定义的。因此,只要您具有必要的范围,就可以随时访问和修改它们。

如果确实是static属性执行的功能是静态的,则调用MyClass.StaticProperty = <some expression>时不会出现问题。如果它是对象的一部分,那么您就不会与类本身联系在一起,也就是说,对于该类的每个实例化对象而言,它可能会有所不同,只需将其变成常规属性即可。

一些静态属性和方法的示例:

public class DoMath
{
   public static string Pi { get; private set; } = "3.14";
   public static double X {get; set;}
   public static double Y {get; set;}

   public static double Sum() => X + Y;
}

DoMath.X = 3.5;
DoMath.Y = 4;
double result = DoMath.Sum();
Console.WriteLine($"Pi is equal to {DoMath.Pi}.");

如果您确实希望某些东西是静态的,那么不要尝试使其变为非静态的。只需这样声明即可。

答案 2 :(得分:0)

静态成员在该类的所有实例或同一T的所有T类的实例之间共享。

因此,您可以使用ClassName.VarName或直接由VarName从类内部访问类之外的静态属性。

您可以从所有非静态方法访问静态字段,属性和方法。

您还可以添加映射静态成员的实例成员。

除了静态存在本身之外,静态事物的实例也不能存在。

所以您可以这样写:

class myClass
{
  public string a = "hello";

  static public string b = "world";

  public string B { get { return b; } set { b = value; } }

  public void DoSomething()
  {
    b = "new world";
  }
}

并像这样使用它:

myClass instance= new myClass();
instance.DoSomething();
myClass.b = "another world";
instance.B = "C# world";