myclass 在以下示例中作为字符串以及 myClass 工作。
我知道每个人都会说这不是一个好习惯,使用类似下面的例子。
CODE:
class myClass
{
public static void Main(string[] args)
{
string @myClass = "my-Class";
myClass.Replace("-", " "); //myClass works as string
myClass ob = new myClass(); //myClass works as myClass
ob.i();
}
public void i()
{
}
}
但我想知道:
答案 0 :(得分:3)
你基本上只是在做一些看起来很奇怪的事情,但编译器可以根据上下文弄清楚它。
string @myClass = "my-Class";
这是声明一个名为myClass的字符串变量。在变量名上使用@允许您创建具有通常不允许的名称的变量(例如关键字)。在您的情况下,不需要@,因为myClass不是关键字,但您仍然可以使用它。有关信息,请参阅此问题:What does the @ symbol before a variable name mean in C#?。
myClass.Replace("-", " ");
这是在你的myClass变量上调用字符串Replace方法。
myClass ob = new myClass();
这是创建一个“myClass”类型的新对象。编译器可以根据用法告诉我,myClass的这种用法是指类型,而不是字符串变量。
答案 1 :(得分:2)
请注意,您甚至不需要@
:
string myClass = "my-Class";
上述情况非常好。
你说:
compiler should give warning.
应该吗?实际上没有歧义。
考虑这个非常典型的场景:
public class MyRandom
{
public Random Random { get; private set; }
public MyRandom()
{
// Is this ambiguous? No--the left HAS to be the property;
// the right HAS to be the type name.
Random = new Random();
}
}
变量的名称也是 types 的名称并不罕见。只有当一些成员重叠时才会出现歧义。例如:
public class MyThreadPool
{
public static void Add(Thread thread)
{
Console.WriteLine("Called the static method.");
}
}
public class SomeOtherClass
{
public List<Thread> MyThreadPool { get; private set; }
public SomeOtherClass()
{
MyThreadPool = new List<Thread>();
}
public void DoSomethingAmbiguous()
{
// To me, it would make sense for the compiler to issue a warning here,
// as it seems rather ambiguous (to me at least). However, it doesn't,
// which tells me the behavior is defined somewhere in the spec (I'm too lazy
// to check).
MyThreadPool.Add(null);
}
}
答案 2 :(得分:1)
下面的行是指您使用字符串@myClass而不是myClass类定义的字符串变量。
myClass.Replace("-", " "); //myClass works as string
答案 3 :(得分:1)
您使用myclass
作为类型和变量名称 - 编译器可以区分它们中的两个,只有当它们发生冲突时才会出现问题 - 即在Main
方法中这会产生编译器错误:
myClass.Main(new string [1]);
答案 4 :(得分:0)
第一个@myClass是实例或变量名,这不会与类(类型)名称myClass冲突。
所以没有错误或警告。