2010-10-07 34 views

Trả lời

18

Bạn có thể sử dụng câu lệnh sử dụng để tạo ra một bí danh cho một loại.

Ví dụ, sau đây sẽ tạo ra một bí danh cho System.Int32 gọi MyInt

using MyInt = System.Int32; 

Ngoài ra, bạn có thể sử dụng thừa kế để giúp đỡ trong một số trường hợp. Ví dụ

Tạo một kiểu People mà là một List<Person>

public class People: List<Person> 
{ 
} 

Không hẳn một bí danh, nhưng nó đơn giản hóa mọi thứ, đặc biệt là đối với các loại phức tạp hơn như thế này

public class SomeStructure : List<Dictionary<string, List<Person>>> 
{ 
} 

Và bây giờ bạn có thể sử dụng loại SomeStructure thay vì khai báo chung chung vui vẻ đó.

Ví dụ bạn có trong nhận xét của mình, đối với một số Tuple bạn có thể làm điều gì đó như sau.

public class MyTuple : Tuple<int, string> 
{ 
    public MyTuple(int i, string s) : 
    base(i, s) 
    { 
    } 
} 
+0

Cập nhật để bao gồm một số lựa chọn thay thế, dựa trên nhận xét của bạn tham chiếu đến Tuple. –

+3

Vì vậy, thực sự, câu trả lời là không, ít nhất là không giống như trong Haskell. 'using' phạm vi từ đồng nghĩa vào tệp cục bộ và bạn không thể xác định hai từ đồng nghĩa khác nhau cho cùng một loại. Thừa kế, ngoài việc được _evil_ trong chính nó, không áp dụng cho các lớp kín như String, đó là các loại chúng ta thường _most_ quan tâm đến việc tạo ra các từ đồng nghĩa. Một cách bổ sung từ đồng nghĩa "tạo" sẽ là đóng gói hoặc bộ điều hợp. Tạo một lớp 'MyTuple' có một thể hiện của' Tuple' ẩn bên trong và chuyển tiếp tất cả các cuộc gọi đến nó (tất nhiên bạn phải thực hiện tất cả các giao diện của kiểu đóng gói). – drozzy

+0

Bạn cũng có thể sử dụng các tiện ích mở rộng để mở rộng lớp học mà không phải kế thừa hoặc sửa đổi nó trực tiếp. Ví dụ: bạn có thể thêm các phương thức vào lớp String, @drozzy. http://msdn.microsoft.com/en-us/library/bb383977.aspx – ps2goat

8

có cách nào để khai báo một từ đồng nghĩa loại trong C# không?

số

Bạn có thể tạo một bí danh với việc sử dụng nhưng đó là giới hạn trong 1 file (namespace).

+0

Có 1 mẹo: http://stackoverflow.com/a/41704128/3241228. Đây không phải là giải pháp cho mọi trường hợp, nhưng nó tốt hơn là không có gì – user1234567

15

Có lẽ bạn đang tìm kiếm Using Alias Directives:

using MyType = MyNamespace.SomeType; 

này cho phép bạn, trong mã của bạn, gõ:

// Constructs a MyNamespace.SomeType instance... 
MyType instance = new MyType(); 
+1

cảm ơn bạn. một số lượng lớn các phản hồi. :) tôi đoán tôi đã bỏ lỡ nó. mặc dù một trong những báo trước ở đây là tôi không thể sử dụng từ đồng nghĩa này trong các tệp khác ... điều đó sẽ tốt đẹp. – akonsu

+1

@akonsu: Không, đây là một cấu trúc thời gian biên dịch, do đó, mỗi tệp (về mặt kỹ thuật, mỗi đơn vị biên soạn hoặc không gian tên - nó chỉ có thể hợp lệ cho ** phần ** của một tệp, tùy thuộc vào vị trí bạn đặt tệp). Bạn cần sao chép tệp này vào bất kỳ tệp nào mà bạn muốn sử dụng. Đó là điều gần nhất C# có một từ đồng nghĩa "loại", tuy nhiên. –

3

Có vẻ như bạn đang nói về một bí danh mà bạn có thể khai báo trong using báo cáo của bạn ở phía trên cùng của codefiles của bạn:

using MyDate = System.DateTime; 
0

Đây không phải là cách đơn giản nhất để giải quyết vấn đề này nhưng khi tôi cần một từ đồng nghĩa loại, tôi tạo một lớp có chuyển đổi tiềm ẩn đến và từ loại mục tiêu, ví dụ:

Tên cần phải đồng nghĩa với chuỗi, Sau đó, bạn có thể thực hiện như sau:

public class Name 
{ 
    public string Value; 
    public static implicit operator string(Name name) { return name.Value; } 
    public static implicit operator Name(string name) { return new Name {Value = name}; } 
} 

Việc này sẽ cho bạn khả năng sử dụng loại Tên xung quanh mã của bạn và trình biên dịch sẽ cho phép bạn gán giá trị cho nó cũng như từ một chuỗi.

Nếu bạn đã có chữ ký phương pháp sau đây:

public void SomeMethodThatNeedsName(Name name) 

Bạn có thể làm điều này:

SomeMethodThatNeedsName("aNameThatComesFromString") 
Các vấn đề liên quan