2014-09-06 27 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

相關問題