【问题标题】:c# how assign static class to instance variable?c#如何将静态类分配给实例变量?
【发布时间】:2019-09-09 08:30:55
【问题描述】:

不能用实例调用静态成员,例如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; //

【问题讨论】:

  • 我的问题是:如果它们是静态的,你为什么要想要在实例上调用它们?用例是什么?
  • 顺便说一句,我想这是一个错字:在b 上重复“静态”...
  • 您为什么要这样做?这似乎会变得非常混乱。
  • 坦率地说,即使可能,我也不会让过去的审查。正如 Sweeper 所说,这确实令人困惑。用户会期望一个实例字段和相应的行为,但实际上会得到一个静态字段的行为。坏主意。
  • 伙计们,我不会只回答你的。我厌倦了 cmets “你为什么想要那个”。你也可以忽略这个话题。

标签: c# static instance


【解决方案1】:

不,没有。你得到的最接近的是使用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;
    }
}

【讨论】:

  • “我想要一个类也包含实例方法和静态方法。”(我强调)所以我认为静态类不会'不会。
  • @Fildor 嗯,不。确实。顺便说一句,您可以安全地删除 static
【解决方案2】:

你正试图在那里做一个反模式。

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

我没有看到调用MyClass.StaticProperty = &lt;some expression&gt; 的问题,如果静态属性确实执行的功能是静态的。如果它是对象的一部分,与类本身无关,即该类的每个实例对象可能不同,那么只需将其转换为常规属性即可。

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

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}.");

如果您真的希望某些东西是静态的,那么就不要试图让它成为非静态的。只需这样声明即可。

【讨论】:

    【解决方案3】:

    静态成员在类的所有实例或同一 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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多