2008-12-03 42 views
15

Mọi lúc và bây giờ, tôi gặp phải cú pháp mà tôi đã thấy trước đây, nhưng chưa bao giờ được sử dụng. Đây là một trong những thời điểm.: cú pháp này (foo) trong C# constructors?

Ai đó có thể giải thích mục đích của ": this" hoặc ": base" theo phương thức khởi tạo C# không?

Ví dụ:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 
{ 
} 

cảm giác ruột của tôi là nó được sử dụng để ánh xạ một đối số mặc định vào một phương pháp xây dựng.

Trả lời

17

Về cơ bản bạn có quyền. this() gọi một hàm tạo trên cá thể hiện tại, base() gọi hàm tạo của supertype trên cá thể hiện tại. Chúng thường được sử dụng để xử lý các quá tải của các hàm tạo nên bạn có thể thêm các tùy chọn bổ sung mà không vi phạm các thứ thành một phương thức riêng biệt.

4

Bạn nói đúng.

: cơ sở (...) gọi hàm tạo của lớp cơ sở.

: this (...) gọi một hàm tạo khác của lớp xác định. Hầu hết thời gian nó chỉ hoạt động như một mặt tiền.

3

Mỗi hàm tạo trong lớp .NET đảm bảo rằng một hàm tạo trong lớp mà nó kế thừa từ cũng được gọi.

Vì vậy, nếu bạn có các lớp sau:

public class Base { } 
public class Something : Base { } 
public class Else : Something { } 

sau đó một constructor trong khác, sẽ gọi một constructor trong Something, mà cũng sẽ gọi một constructor trong Base.

Hàm tạo được gọi trong lớp cơ sở (nghĩa là hàm bạn đang giảm dần) luôn là hàm tạo tham số.

Nếu bạn không có, hoặc muốn ghi đè điều đó, bạn có thể ghi đè nó, bằng cách chỉ định cơ sở (một số thông số ở đây). Điều này sẽ chọn đúng constructor trong lớp cơ sở.

Bạn cũng có thể yêu cầu nhà xây dựng gọi trước một nhà xây dựng khác trong cùng một lớp, cùng cấp. Điều này có thể được sử dụng để tránh trùng lặp mã của hàm xây dựng trong nhiều hàm tạo. Cuối cùng, các nhà xây dựng được gọi sẽ gọi một hàm tạo trong lớp cơ sở.

Tôi hy vọng điều này là dễ hiểu.

19

Cảm giác ruột của bạn là đúng. Cú pháp được sử dụng để gọi constructor quá tải trong cùng một lớp:

public class Test 
{ 
    public Test() : this("Called from default constructor") { } 
    public Test(String msg) 
    { 
     Console.WriteLine(msg); 
    } 
} 

Các mã sau đây:

public static void Main(String[] args) 
{ 
    Test t1 = new Test(); 
    Test t2 = new Test("Called from Main function"); 
} 

đầu ra sau

Called from default constructor 
Called from main function

Tương tự, : base(someParams) được sử dụng để gọi constructor cơ sở .

2

Chính xác. Việc gọi nó là Constructor Chaining và nó được sử dụng để có được xung quanh thực tế là C# không có khả năng làm các đối số mặc định.

Điều này được sử dụng rất nhiều trong IoC.

2

Nó như thế này nếu tôi không nhầm:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 

sẽ gọi

public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing 

và điều đó sẽ tiếp tục cho đến khi bạn có một cơ sở hoặc không có gì.

Nếu bạn có base(....) thì hàm tạo đó sẽ gọi hàm tạo cơ sở với các tham số (nếu có), do đó có thể ủy nhiệm cho các hàm tạo riêng của nó (cùng một trò chơi).

Nếu bạn không có gì, thì hàm tạo ít tham số của lớp cơ sở được gọi tự động.

Sau khi bạn đã sử dụng this(....), khi đó hàm tạo phù hợp với tham số sẽ được sử dụng và phần thân của nó sẽ được thực hiện - bổ sung cho phần thân của hàm tạo đã sử dụng this(....).

2

Có bạn đã đúng. Cú pháp này được sử dụng để có các hàm tạo lớp con của bạn gọi rõ ràng một hàm tạo lớp cơ sở tùy chỉnh thích hợp, chứ không phải là mặc định. Từ khóa này trong câu hỏi của bạn được giải thích:

Một cách khác sử dụng từ khóa này là buộc một hàm tạo gọi hàm khác để tránh logic khởi tạo thành viên dư thừa.

trong Pro C# 2005 và .NET 2.0 Platform, 3rd Edition bởi Andrew Troelsen