2009-05-13 42 views
8

Trong C# khi tôi muốn gọi một phương thức tĩnh của một lớp từ một phương thức tĩnh khác của lớp đó, có tiền tố chung mà tôi có thể sử dụng như là self:: của PHP thay vì tên lớp không?C# tương đương với "self ::" của PHP là gì?

Vì vậy, trong ví dụ dưới đây, thay vì nói Customer.DatabaseConnectionExists(), làm thế nào tôi có thể nói điều gì đó như Self.DatabaseConnectionExists() nên ví dụ sau này nếu tôi thay đổi tên của lớp tôi không phải thay đổi tất cả các tiền tố?

class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public static Customer GetCurrentCustomer() 
    { 
     if (Customer.DatabaseConnectionExists()) 
     { 
      return new Customer { FirstName = "Jim", LastName = "Smith" }; 
     } 
     else 
     { 
      throw new Exception("Database connection does not exist."); 
     } 
    } 

    public static bool DatabaseConnectionExists() 
    { 
     return true; 
    } 
} 
+0

Tôi không biết bất cứ điều gì, nhưng tại sao bạn không chỉ cần đi đến "Refactor" thông qua trình đơn ngữ cảnh - nó sẽ tiết kiệm cho bạn khỏi tai ương chỉnh sửa thủ công – annakata

+1

nhưng ít nhất là từ kinh nghiệm của tôi đọc mã PHP, nếu bạn thấy "self ::" bạn biết bạn đang tham chiếu lớp đó cho dù nó được gọi là gì, nếu bạn thấy "Customer ::" bạn phải nhìn xung quanh để xem bạn có thực sự thuộc lớp Customer hay không. Nó chỉ làm cho mã rõ ràng hơn một chút, một cái gì đó tôi đã từng nhìn thấy. –

Trả lời

15

Không có thực tương đương - bạn phải thể chỉ định tên lớp, tức là

Customer.DatabaseConnectionExists() 

hoặc bỏ lỡ vòng loại hoàn toàn, tức là

DatabaseConnectionExists() 

Phong cách thứ hai của cuộc gọi là được khuyến khích vì nó đơn giản hơn và không mất bất kỳ ý nghĩa nào. Ngoài ra, nội dung này còn trực tuyến hơn với phương thức gọi trong các phiên bản (ví dụ: gọi bằng số InstanceMethod()không phảithis.InstanceMethod(), quá dài dòng).

+3

Tôi nghĩ rằng nó sẽ làm cho mã của bạn dễ đọc hơn nếu bạn sử dụng "cái này". ví dụ các phương thức và "ClassName". cho các phương thức tĩnh, nếu không bạn không biết bằng cách liếc nhìn một cuộc gọi phương thức nếu nó là cho một cá thể hoặc tĩnh. Chuyển từ PHP sang C# Tôi cảm thấy rằng tôi thường phải nhìn xung quanh trong ngữ cảnh của mã để tìm ra sự khác biệt này. –

+0

@Edward Tanguay: Tôi có thể thấy lý do tại sao bạn có thể nghĩ điều này, nhưng thực sự nó chỉ là quá chi tiết (ít nhất theo ý kiến ​​của tôi). Bạn sẽ rất hiếm khi thấy các phương thức được gọi là sử dụng this.MethodName(), chỉ vì nó chống lại hầu hết các hướng dẫn thiết kế. Việc sử dụng 'this' với các trường và thuộc tính, mặt khác, thay đổi khá rộng rãi. – Noldorin

0

Không, không có. Nhưng với các công cụ refactor, việc thay đổi tên của một lớp không nên lo lắng quá nhiều.

13

Nếu bạn đang gọi phương thức từ bên trong lớp, bạn không cần phải chỉ định bất cứ thứ gì như :: Tự, chỉ cần tên phương thức sẽ thực hiện.

class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public static Customer GetCurrentCustomer() 
    { 
     if (DatabaseConnectionExists()) 
     { 
      return new Customer { FirstName = "Jim", LastName = "Smith" }; 
     } 
     else 
     { 
      throw new Exception("Database connection does not exist."); 
     } 
    } 

    public static bool DatabaseConnectionExists() 
    { 
     return true; 
    } 
} 
+0

Tôi đã viết cùng một câu trả lời + thực tế là chúng ta có thể sử dụng một công cụ refactor trong trường hợp chúng ta muốn thay đổi tên của lớp. Cá nhân, tôi sử dụng công cụ tái cấu trúc "Resharper". – Nordes

4

Chỉ cần bỏ qua. DatabaseConnectionExists được định nghĩa bên trong lớp học.

2

Chỉ cần gọi nó mà không cần bất kỳ tiền tố nào.

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