2014-09-06 55 views
0

我有一个学生类具有属性,方法和其在面向对象的概念,任何类包含的变量。当我经历了网络中的字符串类的元数据时,它还包含属性,方法,变量。所以,当我们赋值为String我们做这正常:用户之间的主要区别是什么定义类和字符串

String s = "Code Project"; // No compile error (1st line) 

String test = new String(); // Compile error (2rd line) 

在第2行错误:

“串”不包含一个构造函数0参数

但因为我知道网点中的每个班级都应该有至少有一个构造函数

其次,

如果String类包含属性,方法,变量。然后第一行代码如何工作。 和我试图做我的学生类如果相同的事情它显示我编译错误。

Student s= "Code Project"; // Compile error (3rd line) 

是否有任何多余的东西它们与预定义的类做? ,我们不能在用户定义类中做。

我可以创建一个类似于此的另一个String类吗?

+0

'但是据我所知,网络中的每个班级都应该至少有一个构造函数是什么?你是从哪里听来的?许多类只有一个构造函数。 – gunr2171 2014-09-06 16:52:15

+0

.NET中的每个类都至少有一个构造函数,该语句是正确的。但是你的假设似乎是总会有一个无参数的构造函数,这是不正确的。只有当类没有定义任何构造函数时,才会将无参数构造函数添加到类中。 – 2014-09-06 16:55:35

+1

@Frank不,它不是:'静态类Foo {}'没有构造函数 – 2014-09-06 17:56:33

回答

1

String类没有无参数构造函数,因此String test = new String()不会像您发现的那样进行编译。您可以使用其他string constructors之一创建一个字符串。然而,创建字符串的正常方式是使用字符串文字,例如String s = "Code Project"但这是唯一可能的,因为String类型得到编译器的特殊处理。

对于自己的类型,你可以创建一个implicit user-defined type conversion operator。这里有一个例子:

class Student { 

    public Student(String name) { 
    if (name == null) 
     throw new ArgumentNullException("name"); 
    Name = name; 
    } 

    public static implicit operator Student(String name) { 
    return new Student(name); 
    } 

    public String Name { get; private set; } 

} 

此代码将允许您创建以下分配:

Student student = "Code Project"; 

这将调用隐式操作,并创建一个新的StudentName = "Code Project"

使用隐式运算符可能很有用,但也很令人困惑,因为转换是隐式的,不需要查看源代码,因此您可能很难理解正在发生的事情。一个替代方案是创建一个explicit user-defined type conversion operator

public static explicit operator Student(String name) { 
    return new Student(name); 
} 

在这里,你将不得不使用强制调用操作使之更明确的是怎么回事:

Student student = (Student) "Code Project"; 

甚至

var student = (Student) "Code Project"; 
+0

这是我正在寻找的答案!非常感谢。 – Suraj 2014-09-06 17:26:40

3

string是在这个意义上,它可以通过分配其一个文字字符序列表达来构建特殊。这是该语言的一个特殊功能。

是的,每个类都有至少1构造。如果没有构造函数是用户定义的,则在幕后添加一个无参数的构造函数。

string has 8 constructors,但他们都不是无参数。

您不能分配一个字符序列表达构建自己的类。

+0

我认为OP很困惑,为什么我可以做'var str =“”'但我不能'var myClass = SomeLiteralHere'。我认为澄清点是'String/string'具有语言级别的支持(请参阅'using/IDisposable') – 2014-09-06 17:00:09

+0

如果我们没有明确定义任何构造函数(参数或参数较少),我知道该类至少有一个构造函数,比编译器为我们创建默认值。但是String类没有编译这个语句:String s = new String();它显示“'字符串'不包含一个构造函数,它需要0个参数” – Suraj 2014-09-06 17:05:30

+0

@Jeroen Vannevel感谢这一行“你不能通过给它分配一个字符序列表达式来构建你自己的类” – Suraj 2014-09-06 17:06:41

相关问题