2009-07-01 67 views
34

Trước khi từ khóa this là dấu hai chấm. Bất cứ ai có thể giải thích những gì ruột kết có nghĩa là trong bối cảnh này? Tôi không tin điều này là sự vô lý.Dấu hai chấm (:) nghĩa là gì?

Cảm ơn

using System; 

namespace LinkedListLibrary 
{ 
    class ListNode 
    { 
     private object data; 
     private ListNode next; 

     public ListNode(object dataValue) 
      : this(dataValue, null) 
     { 
     } 

     public ListNode(object dataValue, ListNode nextNode) 
     { 
      data = dataValue; 
      next = nextNode; 
     } 

     public ListNode Next 
     { 
      get 
      { 
       return next; 
      } 
      set 
      { 
       next = value; 
      } 
     } 
     public object Data 
     { 
      get 
      { 
       return data; 
      } 
     } 


    } 
} 
+1

Xem http://stackoverflow.com/questions/338398/-thisfoo-syntax-in-c-constructors –

+0

MSDN bao gồm việc sử dụng cơ sở và từ khóa này cho các nhà xây dựng ở đây: http://msdn.microsoft. com/en-us/library/ms173115 (VS.80) .aspx – rmoore

+1

Và xem thêm http://www.yoda.arachsys.com/csharp/constructors.html – RichardOD

Trả lời

12

Nó được xây dựng chaining nên các nhà xây dựng với sự tiếp theo : this cuộc gọi di chúc chuỗi ctor rằng phù hợp với chữ ký.

Vì vậy, trong trường hợp này

public ListNode(object dataValue) 

đang kêu gọi

public ListNode(object dataValue, ListNode nextNode) 

với null như các param thứ hai qua : this(dataValue, null)

nó cũng đáng chú ý là ctor gọi qua ruột kết thực hiện trước khi ctor được gọi để khởi tạo đối tượng.

+2

"ctor được gọi là executes before": Đây là lý do tại sao trong các ứng dụng WinForms của tôi, tôi làm quá tải constructor và kết thúc với InitializeComponent() trong hàm dựng với tất cả các tham số. Hàm khởi tạo mặc định sẽ gọi quá tải và chuyển đối số mặc định. Thông thường tôi sẽ gió lên với một chuỗi (0 params) -> cuộc gọi -> (1 param) -> cuộc gọi -> (2 params) -> vv -> (hầu hết các params).Bằng cách cung cấp các ctors rỗng như "MainForm(): this (1, null) {}" Tôi kết thúc với không nhiều chi phí, và lưu bản thân mình từ lặp lại mã trong các nhà xây dựng. Tiền thưởng. – maxwellb

50

Nó (cùng với từ khóa this) đang hướng dẫn hàm tạo gọi một hàm tạo khác trong cùng một loại trước khi nó tự thực thi.

Do đó:

public ListNode(object dataValue) 
    : this(dataValue, null) 
{ 
} 

trở nên có hiệu quả:

public ListNode(object dataValue) 
{ 
    data = dataValue; 
    next = null; 
} 

Lưu ý rằng bạn có thể sử dụng base thay vì this để hướng dẫn các nhà xây dựng để gọi một constructor trong lớp cơ sở.

+0

7 năm sau .... Có vẻ như nó sẽ là một cách sử dụng quá tải phương thức trong trường hợp sử dụng 'this', điều này có đúng không? Nếu có, bạn có thể đưa ra ví dụ về trường hợp sử dụng không? –

+0

ý bạn là gì bởi 'lớp cơ sở'? bạn có nghĩa là: https://msdn.microsoft.com/en-us/library/system.type.basetype(v=vs.110).aspx? Im newbie vì vậy xin được cụ thể trong câu trả lời của bạn :) – TechJS

8

Nó có nghĩa là trước khi chạy phần thân, chạy hàm tạo với đối tượng và tham số ListNode.

5

Nó gọi hàm tạo ListNode khác. Bạn có thể làm một điều tương tự với từ khóa cơ sở để gọi một hàm tạo của một lớp mà bạn đang sinh ra.

2

Không, điều đó cho phép bạn thực hiện quá tải hàm dựng hiện có (một với hai tham số), trước khi thực hiện phần thân của hàm tạo mới.

Đó là cách đơn giản nhất để sử dụng lại mã của hàm tạo trong quá tải nhiều hàm tạo.

1

Mã này yêu cầu hàm dựng khác thực hiện với các đối số được cung cấp trước khi phần thân của hàm tạo hiện tại được thực hiện.

+0

Tôi nghĩ rằng bạn đang nghĩ đến C + +. Đây là C#. –

+0

Doh. Đó là những gì sẽ xảy ra khi tôi nhìn vào các thẻ chỉ là một chút quá nhanh. –

+1

Tôi có thể đề nghị chỉnh sửa phần C++ (phần nào vẫn còn gây nhầm lẫn cho nhà phát triển C#) hoặc xóa câu trả lời không? –

1

Đối số chuỗi constructor. Ngoài ra còn có ": base()" cho chuỗi cuộc gọi đến một hàm tạo trên kiểu cơ sở.

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