Khi gọi một phương thức chúng ta có nên sử dụng base.methodname và this.methodname không?


8

Trong C #, với tập hợp lớp được kế thừa - khi gọi một phương thức, chúng ta có nên sử dụng từ khóa 'base.methodname và this.methodname' ... bất kể đó có phải là phương thức được ghi đè hay không?

Mã có thể trải qua những thay đổi về mặt logic và có thể một số điều kiện giống như IF-ELSE có thể xuất hiện vào một ngày sau đó. Vì vậy, tại thời điểm đó, nhà phát triển phải bị buộc phải xem lại từng dòng mã và đảm bảo rằng anh ấy / cô ấy lựa chọn đúng phương thức nào đang được gọi là --- base.methodname () hoặc this.methodname () ELSE. NET framework sẽ gọi DEFAULT (tôi nghĩ rằng base.methodname ()) và toàn bộ logic có thể được sử dụng.


Bạn nên thêm câu trả lời của bạn như một câu trả lời thực sự cho câu hỏi, thay vì đưa nó vào câu hỏi.
yannis

3
"Câu trả lời của tôi là: CÓ - đó là một cách thực hành tốt - sử dụng nó bởi vì đó là lý do tại sao chúng được tạo ra cho". Theo logic đó, tôi cũng có thể nói "KHÔNG - đó là một cách thực hành tốt, sử dụng các từ khóa này là tùy chọn vì một lý do."
pdr

Câu trả lời:


27

Sử dụng basetừ khóa không phải là một câu hỏi ưu tiên, đó là một câu hỏi về tính chính xác. Nếu bạn muốn gọi việc thực hiện lớp cơ sở theo phương thức ghi đè, bạn phải sử dụng base. Nếu bạn không muốn gọi như vậy, bạn không thể sử dụng base.

Mặt khác this, từ khóa là một câu hỏi ưu tiên trong hầu hết các trường hợp. Tôi nghĩ rằng nó chỉ làm xáo trộn mã một cách không cần thiết, vì vậy tôi không sử dụng nó nếu tôi không phải làm vậy. Trường hợp hữu ích là nếu bạn có một tham số phương thức có cùng tên với trường (hoặc thuộc tính). Tôi sẽ sử dụng thistrong trường hợp như vậy. Nhưng nếu tôi đang viết mã mới, tôi có xu hướng sử dụng các quy ước đặt tên để tránh vấn đề này.


Khi tôi viết mã chỉ cho bản thân mình hoặc nó sẽ được duy trì bởi tôi hoặc một nhà phát triển cấp cao khác, tôi sẽ bỏ qua thisnhư giả định. Trong các dự án lớn hơn, nơi tôi sẽ có cơ sở (thậm chí có thể tuyển dụng mới), tiêu chuẩn của chúng tôi là sử dụng các từ khóa đó để có thể thấy rõ phạm vi ngay lập tức bất kể mức độ kinh nghiệm của người viết mã.
Joel Etherton

1
Xin chào joel ... triển vọng của bạn đối với điều này là tại chỗ với quan điểm của tôi. Những gì chúng tôi đang làm việc là một mã C # cũ được viết vào năm 2001 và đôi khi nó là một mê cung ngoài kia. Cũng vào ngày mai, chúng tôi không chắc chắn nhà phát triển sẽ là ai (thực tập sinh hoặc có kinh nghiệm) sau một vài năm ... do đó, nếu các từ khóa này được sử dụng và ai đó tiếp tục thực hiện các phương thức ghi đè (vì lợi ích của đa hình) thì nhà phát triển đó sẽ buộc phải xem lại từng cuộc gọi của một phương thức đã cho để logic không bị lỗi.
MukeshAnAlsoRan

Nếu tôi không ghi đè một phương thức, tại sao tôi không thể sử dụng cách basegọi này, mặc dù nó sai về mặt ngữ nghĩa?
Ded repeatator

1
@JoelEtherton Tôi không nghĩ lập trình để phục vụ cho "mẫu số chung thấp nhất" như thế là một ý kiến ​​hay. Tôi sẽ hiểu lý do đó nếu thảo luận về một cái gì đó phức tạp hơn đáng kể, nhưng thislà về cơ bản như nó được. Nếu các lập trình viên chưa hiểu phạm vi của các phương thức (và sự this.truy cập ngầm của các thành viên đối tượng, ngay cả khi không được viết rõ ràng), thì họ phải nghiên cứu để làm. Đó là về họ .
Alexander - Tái lập Monica

1
@JoelEtherton Tôi thường đồng ý. Ví dụ, tôi sẽ không phát điên với siêu dữ liệu mẫu C ++. Nhưng thực sựthis là cơ bản. Đó là kiến ​​thức dự kiến ​​về từng nấc thang của kỹ năng lập trình.
Alexander - Tái lập Monica

5

Tôi sẽ đề nghị rằng nếu bạn gọi một phương thức cơ bản một cách rõ ràng từ một lớp trong đó phương thức đó bị ghi đè, bạn có một vấn đề nghiêm trọng về cả logic và khả năng đọc. basechỉ thực sự xuất hiện khi gọi việc thực hiện cơ sở của một phương thức được ghi đè từ phương thức được ghi đè đó.

Ở mọi nơi khác, nó sẽ là this(nếu phương thức không bị ghi đè thì dù sao nó cũng sẽ đến lớp cơ sở) và không có gì sai khi cho phép trình biên dịch suy ra điều đó.


0

thistừ khóa: Không có quy tắc cứng và nhanh để áp dụng thistừ khóa vì đó là sở thích cá nhân nhưng mã của bạn có thể bị lộn xộn.

Ưu và nhược điểm của việc sử dụng từ khóa này trong C #

basekeyword (tái sử dụng): Đã có câu trả lời cho biết việc sử dụng cơ sở. Tôi muốn thêm một điểm.

Chức năng chung cho tất cả các lớp dẫn xuất sẽ có trong lớp cơ sở và bạn có thể gọi phương thức cơ sở theo sau là việc triển khai cụ thể trong phương thức trong lớp dẫn xuất đạt được khả năng sử dụng lại.


0

Ngoài việc được đề cập, bạn có thể sử dụng "này" khi gọi một chức năng mở rộng.

public static class ExtensionForMyClass {  
public static void SomeFunction (this MyClass inst) {} 
}

Bạn không thể làm:

SomeFunction();

từ bên trong cơ thể MyClass. Chỉ có:

this.SomeFunction();

Không có lý do thực sự để tạo các phần mở rộng tĩnh cho lớp bạn đang thực hiện. Một kịch bản khi nó hữu ích với tôi là khi tôi có các hàm mở rộng dựa trên giao diện mà lớp tôi đang triển khai, chứ không phải trên chính lớp đó.


0

Tôi khuyên bạn nên bỏ this.tiền tố, trừ trường hợp nó thêm đối xứng. Ví dụ:

public class Foo: IComparable {
    int value1, value 2;

    public int CompareTo(object _that) {
        if (_that == null) return 1;
        if (Object.ReferenceEquals(this, _that)) return 0;

        Foo that = (foo) _that;
        var result = this.value1.CompareTo(that.value1)
        if (result != 0) return result;

        result = this.value2.CompareTo(that.value2)
        if (result != 0) return result;

        return 0
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.