2011-02-02 29 views
6

Có tương đương với this trong C# cho các thành viên tĩnh không?Có tương đương với 'this' trong C# cho các thành viên tĩnh không?

Tôi thích sử dụng this để làm cho mã của tôi dễ đọc hơn, nhưng tự hỏi liệu có tương đương với các thành viên tĩnh hay không.

+0

Cảm ơn tất cả vì câu trả lời của bạn. Tôi đánh giá cao câu trả lời đơn giản cho câu hỏi này là 'không', nhưng quan điểm của tôi là tìm hiểu xem có cách nào phân biệt giữa thành viên tĩnh thuộc lớp bạn không đang làm việc trong hoặc một thành viên của lớp khác. Kết luận của tôi là, về mặt phong cách, tốt nhất nên sử dụng tên lớp khi làm việc trong một lớp khác (điều kiện tiên quyết) và không có tên lớp khi trong lớp đó. Tôi sẽ trao giải đáp cho @AakashM cho lời giải thích nhanh chóng và đầy đủ (hoặc hết sức). :-) –

Trả lời

13

Tôi cho rằng nếu bạn sử dụng this. để củng cố mà bạn đang đề cập đến các thành viên dụ, tương đương với một thành viên tĩnh sẽ được sử dụng ClassName.

Nhưng phong cách nghệ thuật, tại sao thêm mã mà không làm thay đổi nghĩa?


chỉnh sửa thêm làm rõ khác nhau:

câu cuối cùng của tôi ở trên có thể được minh họa bằng những ví dụ:

class Example1 
{ 
    public int J { get; set; } 

    public Example1() 
    { 
     J = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int InstanceMethodLong() 
    { 
     return this.J; 
    } 

    public int InstanceMethodShort() 
    { 
     return J; 
    } 
} 

Các this. trong InstanceMethodLong không thay đổi ý nghĩa so với InstanceMethodShort.

Tĩnh:

class Example2 
{ 
    public static int K { get; set; } 

    static Example2() 
    { 
     K = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int StaticMethodLong() 
    { 
     return Example2.K; 
    } 

    public int StaticMethodShort() 
    { 
     return K; 
    } 

Các Example2. trong StaticMethodLong không thay đổi ý nghĩa so với StaticMethodShort.

Trong cả hai trường hợp này, việc thêm vòng loại kết quả trong cùng một CIL, cùng một hành vi và có nhiều nguồn hơn để viết, đọc và hiểu. Stylistically - và tôi sẽ vui vẻ chấp nhận rằng đây là một câu hỏi về phong cách mã - Tôi thấy không có lý do gì để nó ở đó.


Với tiền tố gạch tình hình là hơi khác nhau:

class Example3 
{ 
    int _j; 

    public int J 
    { 
     get { return _j; } 
     set 
     { 
      _j = value; 
      // and do something else, 
      // to justify not using an auto-property 
     } 
    } 

    public Example3() 
    { 
     J = 0; 
    } 

    public int MethodWithParameter(int j) 
    { 
     // Now there is a *difference* between 
     return j; 

     // and 
     return _j; 
    } 
} 

Ở đây, trong MethodWithParameter, có một sự khác biệt giữa đề cập đến _jj - vì vậy chúng tôi đang cố tình và rõ ràng thể hiện ý nghĩa khác nhau . Đúng là trình biên dịch không quan tâm chúng tôi gọi tên biến của chúng tôi là gì, nhưng nó không quan tâm đến những biến mà chúng tôi đang đề cập đến! Vì vậy, trong phần thân của MethodWithParameter, việc sử dụng hoặc không sử dụng dấu gạch dưới không phải là chỉ mang tính phong cách, đó là ngữ nghĩa. Đó không phải là vấn đề cụ thể mà chúng tôi đang giải quyết trong câu hỏi này.

+7

Nó có thể thay đổi ý nghĩa của * người duy trì * của mã. Trình biên dịch không quan tâm theo cách này hay cách khác. –

+0

Có cách nào để làm cho loại này không biết a la 'selftype.name'? (tức là nếu tôi muốn đổi tên lớp của mình) – xtofl

+0

@Eric Tôi thực sự đồng ý rằng "mã nên được viết chủ yếu cho mọi người và chỉ tình cờ cho máy tính" - NHƯNG chúng tôi đang ở trên cùng của một dốc rất * trơn trượt - tôi muốn muốn nhắm đến một nơi mà những người bảo trì của tôi hiểu ý định của tôi theo cách giống hệt như trình biên dịch, thay vì phục vụ cho sự hiểu biết không đầy đủ trong những người bảo trì của tôi. Điều gì tiếp theo, "tránh LINQ vì một số người thấy nó khó hiểu"? – AakashM

2

Bạn có thể sử dụng tên lớp để tham chiếu các thuộc tính tĩnh khác.

Mã của bạn trở nên có khả năng chống sao chép/dán nhiều hơn một chút nhưng đó không phải lúc nào cũng là điều xấu.

1

Tôi thích "điều này" cũng như realsie từ cái nhìn đầu tiên nơi tiểu bang đang thay đổi. Bạn có thể muốn xem xét tên của loại cho các thành viên tĩnh trong trường hợp này.

2

Thật không may, không có this cho phương pháp tĩnh. Để giúp phân biệt các thành viên tĩnh từ các thành viên lớp, tôi thêm tiền tố cho nó với tên lớp.

class Test { 
    static Regex TextRegex = new Regex(...); 

    public static bool TestString(string input) { 
    return Test.TextRegex.IsMatch(input); 
    } 
} 
3

Là một thành viên tĩnh được không có nghĩa là thuộc về bất kỳ trường hợp cụ thể (như this đề cập đến một thể hiện của một đối tượng, với các thiết lập khác nhau có thể mỗi trường hợp), những gì bạn sẽ thay muốn làm là sử dụng ClassName.Member thay của this.Member.

public class Orange 
{ 
    public static string Tastes = "sweet"; 

    public static string FoodType(){ 
     return "fruit"; 
    } 
} 

sẽ được gọi bởi:

Console.WriteLine(Orange.Tastes); 

Cùng đi cho các phương pháp tĩnh, cũng như:

Console.WriteLine(Orange.FoodType()). 

Xin lưu ý đây là một ví dụ giả tạo cho cuộc biểu tình mà thôi. :)

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