2010-06-30 47 views
7

我希望能夠初始化類,就像我初始化字符串:如何在C#中創建一個類,以便像字符串一樣初始化?

string str = "hello"; 
MyClass class = "hello"; 

我真的不知道到底string str = "hello";做什麼。我假設"hello"被編譯器翻譯成new System.String("hello");,但我不確定。也許是不可能的,或者我錯過了非常基本的東西;如果是這種情況,請原諒我的無知:)。我想要做的是一個像字符串一樣工作的類,但是會自動將該字符串存儲在文件中。

好吧,這裏是我的代碼讀你的答案後:

class StringOnFile 
{ 
    private static string Extension = ".htm"; 
    private string _FullPath; 
    public bool Preserve = false; 

    public string FullPath 
    { 
     get 
     { 
      return _FullPath; 
     } 
    } 

    public static implicit operator StringOnFile(string value) 
    { 
     StringOnFile This = new StringOnFile(); 
     int path = 0; 

     do{ 
      path++; 
      This._FullPath = Path.GetFullPath(path.ToString() + Extension); 
     } 
     while(File.Exists(This._FullPath)); 

     using (StreamWriter sw = File.CreateText(This._FullPath)) 
     { 
      sw.Write(value); 
     } 

     return This; 
    } 

    public static implicit operator string(StringOnFile stringOnFile) 
    { 
     using (StreamReader sr = File.OpenText(stringOnFile._FullPath)) 
     { 
      return sr.ReadToEnd(); 
     } 
    } 

    ~StringOnFile() 
    { 
     if(!Preserve) File.Delete(FullPath); 
    } 
} 

你覺得呢?

+0

哦,順便說一下,是否有任何方法可以使代碼在非代碼句中(我現在正在討論這個論壇)(如代碼「hello 「在我的問題中,在句子」我認爲「你好」被翻譯......「)中有顏色就像我的問題中的兩行代碼? – Juan 2010-06-30 19:01:27

+0

「我假設'」hello「'被編譯器轉換成新的'System.String(」hello「)'」 - 不,字符串文字以很低的級別嵌入.NET運行時。 C#中的「hello」對應於IL中的ldstr「hello」指令。 – 2010-06-30 19:13:40

+0

所以我們可以說字符串類有一個隱式轉換爲ldstr(我假設這是一個指向包含字符串的memeory塊的指針)?我只是想從這個意義上理解。想要弄清楚什麼是通用規則,除非沒有'string str =「somthing」的通用規則;'''''''''''''''''' – Juan 2010-06-30 19:35:41

回答

8

請嘗試以下

class MyClass { 
    public static implicit operator MyClass(string value) { 
     // Custom logic here 
     return new MyClass(); 
    } 
} 

void Example() { 
    MyClass v1 = "data"; 
} 

這將讓導致你正在尋找結束。不過,我會建議反對這種方法。隱式轉換有幾個陷阱,您最終會遇到。更好的是,只需要一個構造函數,其構造函數需要string

+4

或者是一個靜態方法 - 當然,它可以提供更多關於字符串的預期含義的信息:'FromName'等。這也允許具有相同參數但含義不同的多種方法。 – 2010-06-30 19:06:48

+0

對於最終建議+1:使用字符串的ctor更好,更清晰,但只有在語義上有意義時才使用它,即字符串應該是構建對象的重要組成部分。 – Abel 2010-06-30 19:48:43

5

好含蓄的轉換,你可以創建從字符串隱式轉換到您的類型...但我個人很少這樣做。從LINQ到XML,所做的類的一個示例是XNamespace。您的課真的只是有一個字符串成員?如果是這樣,也許它是合適的。或者,也許它只有一個字符串和其他一些通常可以默認的字段......但在大多數的情況下,我不希望從string轉換爲適當的。

換句話說:您的用戶是否應該像字符串一樣真正地思考自己的類?它實際上是一個字符串包裝?如果你能給我們更多的細節,我們可以提供更多的建議。

並且不,編譯器不會將「hello」翻譯成new System.String("hello") - 這隻會導致遞歸問題,當然也會打破實習。 IL直接支持C#編譯器使用的字符串常量。

相關問題