2013-06-23 29 views
5

Làm cách nào tôi có thể chuyển thông qua một bộ phận này đến bộ phận khác? Giả sử chúng ta có lớp này. Làm cách nào để chuyển từ foo (chuỗi, chuỗi) sang foo (Uri)?Xây dựng chuỗi kết nối các giá trị tính toán cho các tham số

public foo 
{ 
    string path { get; private set; } 
    string query { get; private set; } 

    public foo (Uri someUrl) 
    { 
     // ... do stuff here 
    } 

    public foo (string path, string query) 
    { 
     Uri someUrl = new Uri(String.Concat(path, query); 

     // ... do stuff here to pass thru to foo(someUrl) 
    } 
} 
+0

Bỏ phiếu để mở lại. Câu trả lời trong bài đăng trùng lặp là chính xác nhưng được định hướng nhiều hơn để tham số "đơn giản" đi tới hàm tạo tiếp theo. Bài viết của OP cho thấy rằng có một số xử lý được thực hiện cho URI trước khi chuyển nó đi. Một câu trả lời phù hợp hơn sẽ là có một phương thức chung mà cả hai nhà xây dựng gọi và truyền tham số bằng tham chiếu. – keyboardP

+0

@keyboardP, đồng ý với bạn. Tôi đã sửa đổi tiêu đề để phản ánh chính xác hơn và đã bỏ phiếu để mở lại. (cũng tìm kiếm bản sao của sắc thái này, và xuất hiện trống) –

+0

Cảm ơn bạn đã mở cửa trở lại. –

Trả lời

4

Bạn cũng có thể làm điều gì đó như:

class Frob 
{ 
    public Frob (Uri uri) 
    { 

    } 

    public Frob(string path, string query) 
     : this(TidyUpUri(path, query)) 
    { 

    } 

    private static Uri TidyUpUri(string path, string query) 
    { 
     var uri = new Uri(string.Concat(path, query)); 

     // etc. 

     return uri; 
    } 
} 
+0

Tuyệt vời. Đây là kỹ thuật tôi đã sử dụng. Cảm ơn! –

7

Đối với chaining constructor đơn giản, bạn có thể sử dụng các từ khóa đặc biệt this hoặc base để chỉ đơn vị thi công khác hiện tại hoặc parent class của. Bạn được phép sử dụng bất kỳ tham số nào cho hàm tạo thi hành làm tham số cho hàm tạo chuỗi và bạn có thể kết hợp chúng bằng cách sử dụng bất kỳ biểu thức hợp pháp nào. Điều này về cơ bản là các quy tắc tương tự áp dụng cho bất kỳ biểu thức nội tuyến nào khác được cung cấp cho một cuộc gọi hàm, ngoại trừ việc bạn nên tránh sử dụng bất kỳ thành viên nào của lớp (vì nó chưa được xây dựng) và giới hạn các tham số và tham số pass:

public foo (Uri someUrl) 
{ 
    this.url = someUrl; 
} 

public foo (string path, string query) 
    : this(new Uri(String.Concat(path, query))) 
{ 
    // this.url is now set and available. 
} 

Điều này sẽ hoạt động miễn là việc xử lý bạn cần làm có thể được thực hiện trong một biểu thức có giá trị duy nhất. Ví dụ: nếu bạn cần, để làm điều gì đó khác với Uri trước khi được gửi tới nhà xây dựng khác hoặc nếu bạn cần một số logic phức tạp nếu bạn không thể loại bỏ kỹ thuật này. Cách khác là để cấu trúc lại mã của bạn vào một phương pháp khởi tạo:

public foo (Uri someUrl) 
{ 
    this.init(someUrl); 
} 

public foo (string path, string query) 
{ 
    var url = String.Concat(path, query); 
    url = url.Replace("http://", "https://"); 

    this.init(url); 
} 

private void init (Uri someUrl) 
{ 
    this.url = someUrl; 
} 
+1

Nitor nhỏ, nhưng có lẽ tốt hơn là đặt 'init' riêng tư. –

+0

Tôi hiểu! Nếu tôi có yêu cầu chuỗi phức tạp hơn, tôi sẽ thiết lập một init lần sau. Cảm ơn! –

2

Vì bạn đang xử lý chuỗi của bạn trước khi chuyển chúng cùng, bạn có thể giải nén vào một phương pháp chung. Ví dụ

private void ProcessUri(ref Uri theUri) 
{ 
    //...do your URI stuff here 
} 

public foo (Uri someUrl) 
{ 
    ProcessUri(ref someUrl); 
} 

public foo (string path, string query) 
{ 
    Uri someUrl = new Uri(String.Concat(path, query)); 

    // ... do stuff here to pass then call ProcessUri 
    ProcessUri(ref someUrl); 
} 

Ưu điểm của việc điều đi qua với ref là bạn có thể thiết lập các giá trị của thuộc tính readonly giống như bạn sẽ nếu biến được đặt trong các nhà xây dựng.

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