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