2010-06-30 74 views
7

Tôi muốn để có thể khởi tạo một lớp giống như tôi khởi tạo một chuỗi:Làm cách nào để tạo một lớp trong C# mà tôi có thể khởi tạo giống như một chuỗi?

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

Tôi thực sự không biết chính xác những gì string str = "hello"; làm. Tôi giả sử "hello" được dịch bởi trình biên dịch thành new System.String("hello"); nhưng tôi không chắc chắn. Có lẽ là không thể hoặc có thể tôi đang thiếu một cái gì đó rất nguyên tố; nếu đó là trường hợp lý do sự thiếu hiểu biết của tôi :). Những gì tôi đang cố gắng để làm là một lớp học hoạt động giống như một chuỗi nhưng lưu trữ chuỗi trong một tập tin tự động.

Ok, đây là mã của tôi sau khi đọc bạn câu trả lời:

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); 
    } 
} 

Bạn nghĩ gì?

+0

Ồ, và nhân tiện, có cách nào để làm cho mã bên trong một câu không mã (tôi đang nói về diễn đàn này ngay bây giờ) (giống như mã "hello "bên trong câu" tôi giả định "hello" được dịch ... "trong câu hỏi của tôi) có màu sắc giống như hai dòng mã trong câu hỏi của tôi? – Juan

+0

"Tôi giả sử' "hello" 'được dịch bởi trình biên dịch thành mới' System.String ("hello") '" - không, chuỗi ký tự được xây dựng trong thời gian chạy .NET ở mức rất thấp. '" hello "' trong C# tương ứng với lệnh 'ldstr" hello "' trong IL. –

+0

Vì vậy, chúng ta có thể nói rằng lớp chuỗi có một chuyển đổi tiềm ẩn để một ldstr (Tôi giả định đó là một con trỏ đến một khối memeory chứa một chuỗi)? Tôi chỉ cố gắng hiểu được điều này. Bạn muốn tìm ra nguyên tắc chung là gì, trừ khi không có quy tắc chung cho 'string str =" somthing ";' và trình biên dịch thực hiện điều gì trong trường hợp đó, nó chỉ thực hiện cho trường hợp đó. – Juan

Trả lời

8

Hãy thử như sau

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

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

này sẽ nhận được kết quả cuối cùng bạn đang tìm kiếm. Tuy nhiên tôi sẽ tư vấn cho phương pháp này. Có một số cạm bẫy với các chuyển đổi tiềm ẩn mà cuối cùng bạn sẽ gặp phải. Tốt hơn hết là chỉ cần có một hàm tạo có string

+4

Hoặc một phương pháp tĩnh, tất nhiên - có thể có nhiều thông tin hơn về ý nghĩa dự kiến ​​của chuỗi: 'TừName' vv Điều đó cũng cho phép nhiều phương thức có cùng tham số nhưng ý nghĩa khác nhau. –

+0

+1 cho lời khuyên cuối cùng: tốt hơn và rõ ràng hơn để có một ctor mà có một chuỗi, nhưng sử dụng nó chỉ khi nó có ý nghĩa ngữ nghĩa, tức là, chuỗi nên là một phần cần thiết quan trọng trong * xây dựng * đối tượng. – Abel

5

Vâng, bạn có thể tạo một chuyển đổi ngầm từ xâu thành kiểu của bạn ... nhưng tôi sẽ đích thân hiếm khi làm như vậy. Một ví dụ về một lớp mà làmXNamespace từ LINQ đến XML. Lớp học của bạn thực sự là chỉ có một thành viên chuỗi? Nếu có, có thể nó phù hợp. Hoặc có thể nó chỉ có một chuỗi và một số trường khác thường có thể được mặc định ... nhưng trong hầu hết các trường hợp, tôi sẽ không mong đợi chuyển đổi từ string là thích hợp.

Nói cách khác: người dùng của bạn có thực sự nghĩ về lớp học của bạn theo cách giống hệt như chuỗi không? Có hiệu quả là một wrapper xung quanh một chuỗi? Nếu bạn có thể cung cấp thêm chi tiết, chúng tôi có thể tư vấn thêm.

Và không, trình biên dịch không dịch "hello" thành new System.String("hello") - điều đó sẽ chỉ gây ra một vấn đề đệ quy, tất nhiên, cũng như vi phạm thực tập. IL có hỗ trợ trực tiếp cho các hằng số chuỗi, mà trình biên dịch C# sử dụng.

Các vấn đề liên quan