Bí danh không gian tên C # - vấn đề là gì?


95

Ở đâu hoặc khi nào người ta sẽ sử dụng bí danh không gian tên như

 using someOtherName =  System.Timers.Timer;

Đối với tôi, có vẻ như nó sẽ chỉ gây thêm sự nhầm lẫn khi hiểu ngôn ngữ.


6
Làm thế nào về một hệ thống rộng using int = System.Int32trong C #? Hữu ích phải không? Công dụng tương tự của nó mà có thể được tận dụng ở những nơi khác.
nawfal

@nawfal Tôi tin rằng loại bí danh không thể xuất được. Có nghĩa là bạn không thể định nghĩa một cái gì đó như thế nào using int = System.Int32và sử dụng nó ở những nơi khác ngoài tệp khai báo. Vì vậy, điều này intđối với Int32bí danh có thể đạt được bằng một số phương tiện khác, hoặc là một điều đặc biệt trong trình biên dịch / thời gian chạy.
KFL

1
@KFL điều đó đúng, nhưng lợi ích mà cả hai mang lại đều có cùng bản chất.
nawfal

1
@nawfal lập luận của bạn using int = System.Int32vừa sai vừa gây hiểu lầm - nó sai vì intbí danh không được triển khai theo cách bạn đã mô tả. Nó gây hiểu lầm vì bạn ngụ ý loại bí danh có thể được sử dụng trên toàn cầu, giống như cách intđược sử dụng qua Int32.
KFL

2
@KFL tôi không ngụ ý cả hai. Tôi chỉ nêu lý do tại sao có một tên tùy chỉnh cho một loại có thể hữu ích.
nawfal

Câu trả lời:


151

Đó là một bí danh kiểu, không phải là một bí danh không gian tên; rất hữu ích để phân biệt - ví dụ: chống lại:

using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

(ps: cảm ơn vì sự lựa chọn của Timer;-p)

Ngược lại, nếu bạn sử dụng cả hai System.Windows.Forms.TimerSystem.Timers.Timertrong cùng một tệp, bạn phải tiếp tục cung cấp tên đầy đủ (vì Timercó thể gây nhầm lẫn).

Nó cũng đóng một vai trò nào đó với externbí danh để sử dụng các loại có cùng tên loại đủ điều kiện từ các tập hợp khác nhau - hiếm, nhưng hữu ích để được hỗ trợ.


Trên thực tế, tôi có thể thấy một cách sử dụng khác: khi bạn muốn truy cập nhanh vào một loại, nhưng không muốn sử dụng loại thông thường usingvì bạn không thể nhập một số phương thức mở rộng xung đột ... hơi phức tạp, nhưng ... đây là một ví dụ ...

namespace RealCode {
    //using Foo; // can't use this - it breaks DoSomething
    using Handy = Foo.Handy;
    using Bar;
    static class Program {
        static void Main() {
            Handy h = new Handy(); // prove available
            string test = "abc";            
            test.DoSomething(); // prove available
        }
    }
}
namespace Foo {
    static class TypeOne {
        public static void DoSomething(this string value) { }
    }
    class Handy {}
}
namespace Bar {
    static class TypeTwo {
        public static void DoSomething(this string value) { }
    }
}

8
Nó có thể được sử dụng để làm bí danh cho không gian tên hoặc tên kiểu.
Sean Bright

1
@Sean: có, nhưng ví dụ được đưa ra là cho một loại
Marc Gravell

@lupefiasco: thuận tiện của OP để lựa chọn System.Timers.Timer;-p
Marc Gravell

À, tưởng rằng bạn đang đề cập đến khái niệm chứ không phải ví dụ cụ thể. Mea culpa.
Sean Bright

26

Tôi sử dụng nó khi tôi có nhiều không gian tên với các không gian tên phụ và / hoặc tên đối tượng xung đột, bạn chỉ có thể làm điều gì đó như [làm ví dụ]:

using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;

...

src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();

Nếu không thì sẽ phải viết:

Namespace1.Subspace.DataAccessObjects.DataObject source = 
  new Namespace1.Subspace.DataAccessObjects.DataObject();

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
  new Namespace2.Subspace.DataAccessObjects.DataObject();

Nó giúp tiết kiệm rất nhiều lần gõ và có thể được sử dụng để làm cho mã dễ đọc hơn rất nhiều.


17

Ngoài các ví dụ đã đề cập, bí danh kiểu (chứ không phải bí danh không gian tên) có thể hữu ích khi liên tục đề cập đến các kiểu chung:

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}

Đấu với:

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}

8

Sự hấp dẫn.

Có những lợi ích bên lề để cung cấp sự rõ ràng giữa các không gian tên chia sẻ tên loại, nhưng về cơ bản nó chỉ là đường.


Nó hiển thị rõ ràng bạn đang sử dụng ký hiệu nào. Nó không chỉ là đường, mà là một chút dài dòng (nếu bạn không muốn xác định một tên mới).
Earth Engine

7

Tôi luôn sử dụng nó trong những tình huống như thế này

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

nơi Utilitynếu không sẽ có một bối cảnh khác nhau (như MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility), nhưng tôi hy vọng / thích Utilityđể luôn luôn điểm đến mà một lớp học đặc biệt.


6

Nó rất hữu ích khi bạn có nhiều lớp có cùng tên trong nhiều không gian tên được bao gồm. Ví dụ...

namespace Something.From.SomeCompanyA {
    public class Foo {
        /* ... */
    }
}

namespace CompanyB.Makes.ThisOne {
    public class Foo {
        /* ... */
    }
}

Bạn có thể sử dụng bí danh để làm cho trình biên dịch hài lòng và làm cho mọi thứ rõ ràng hơn cho bạn và những người khác trong nhóm của bạn:

using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();

3

Chúng tôi đã xác định bí danh không gian tên cho tất cả các không gian tên của chúng tôi. Điều này giúp bạn rất dễ dàng xem một lớp đến từ đâu, ví dụ:

using System.Web.WebControls;
// lots of other using statements

// contains the domain model for project X
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality
using web = Company.Web;
// etc.

// User from the domain model
dom.User user = new dom.User(); 
// Data transfer object
dto.User user = new dto.User(); 
// a global helper class
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality
// (as opposed to System.Web.Controls.HyperLink)
web.HyperLink link = new web.HyperLink(); 

Chúng tôi đã xác định một số nguyên tắc về cách đặt tên bí danh và mọi người đang sử dụng chúng.


1
Bạn không thấy rằng bí danh thường liên quan nhiều đến ngữ cảnh mà nó đang được sử dụng hơn là vị trí thực tế của đối tượng sao?
BenAlabaster

2

Tôi thấy bí danh rất hữu ích trong thử nghiệm đơn vị. Khi bạn đang viết các bài kiểm tra đơn vị, một thông lệ phổ biến là khai báo đối tượng kiểm tra là

MyClass myClassUT;

myClassUTchủ đề U nder T est. Nhưng nếu bạn muốn viết các bài kiểm tra đơn vị cho một lớp tĩnh với các phương thức tĩnh thì sao? Sau đó, bạn có thể tạo một bí danh như sau:

using MyStaticClassUT = Namespace.MyStaticClass;

Sau đó, bạn có thể viết các bài kiểm tra đơn vị của mình như sau:

public void Test()
{
    var actual = MyStaticClassUT.Method();
    var expected = ...
}

và bạn không bao giờ rời mắt khỏi đối tượng được kiểm tra là gì.


2

Theo một cách nào đó, nó thực sự tiện dụng khi viết mã trong Visual Studio.

Ca sử dụng : Giả sử tôi chỉ sử dụng một số lớp, ví dụ SqlConnectiontừ một không gian tên System.Data. Trong khóa học bình thường, tôi sẽ nhập System.Data.SqlClientkhông gian tên ở đầu tệp * .cs như hình dưới đây:

using System.Data;

Bây giờ hãy nhìn vào intellisense của tôi. Nó được phổ biến rộng rãi với rất nhiều lớp để lựa chọn trong khi gõ vào trình soạn thảo mã. Tôi sẽ không sử dụng toàn bộ các lớp học:

nhập mô tả hình ảnh ở đây

Vì vậy, tôi muốn sử dụng một bí danh ở đầu tệp * .cs của mình và có được chế độ xem intellisense rõ ràng:

using SqlDataCon = System.Data.SqlClient.SqlConnection

Bây giờ hãy nhìn vào chế độ xem intellisense của tôi. Nó siêu trong và siêu sạch.

nhập mô tả hình ảnh ở đây


1

Một lý do tôi biết; Nó cho phép bạn sử dụng tên ngắn hơn khi bạn có xung đột tên từ không gian tên đã nhập. Thí dụ:

Nếu bạn đã khai báo using System.Windows.Forms;using System.Windows.Input; trong cùng một tệp khi truy cập, ModifierKeysbạn có thể thấy rằng tên ModifierKeysnằm trong cả không gian tên System.Windows.Forms.ControlSystem.Windows.Inputkhông gian tên. Vì vậy, bằng cách khai báo, using Input = System.Windows.Input;bạn có thể nhận được System.Windows.Input.ModifierKeysthông qua Input.ModifierKeys.

Tôi không phải là người yêu thích C # nhưng không gian tên răng cưa có vẻ là "phương pháp hay nhất" đối với tôi. Bằng cách đó, bạn biết những gì bạn đang nhận được và vẫn không phải nhập quá nhiều.


1

Bạn có thể sử dụng chúng để sửa đổi mã rất dễ dàng.

Ví dụ:

#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif

public void BNumber DoStuff(BNumber n) {
    // ...
}
public void BNumber DoStuff2(BNumber n) {
    // ...
}
public void BNumber DoStuff3(BNumber n) {
    // ...
}

Bằng sự thay đổi đơn giản của chỉ thị, bạn có thể quyết định xem toàn bộ mã của bạn có hoạt động floathay không double.

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.