Псевдоним пространства имен C# - какой смысл?

Следите за методами реагирования на жизненный цикл!

Я работал несколько часов, чтобы узнать, что getDerivedStateFromProps будет вызван после каждого setState().

87
задан Brad 2 February 2009 в 22:55
поделиться

7 ответов

Это - псевдоним типа, не псевдоним пространства имен; полезно снять неоднозначность - например, против:

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

(PS: спасибо за выбор Timer;-p)

Иначе, если бы Вы используете и System.Windows.Forms.Timer и System.Timers.Timer в том же файле, который необходимо было бы продолжать давать полным именам (так как Timer могло сбивать с толку).

Это также играет роль с extern псевдонимы для использования типов с тем же полностью определенным именем типа от различных блоков - редкий, но полезный, чтобы поддерживаться.

<час>

На самом деле, я вижу другое использование: когда Вы хотите быстрый доступ к типу, но не хотите использовать постоянного клиента using, потому что Вы не можете импортировать некоторые конфликтующие дополнительные методы... немного замысловатые, но... вот пример...

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) { }
    }
}
142
ответ дан Marc Gravell 5 November 2019 в 15:23
поделиться

В дополнение к упомянутым примерам введите псевдонимы (а не псевдонимы пространства имен) может быть удобным при повторном обращении к универсальным типам:

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

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

По сравнению с:

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}
17
ответ дан Joel Mueller 5 November 2019 в 15:23
поделиться

Я использую его, когда у меня есть несколько пространств имен с конфликтом sub пространства имен и/или имена объектов, Вы могли просто сделать что-то как [как пример]:

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

...

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

, Который должен был бы иначе быть записан:

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

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

Это сохраняет тонну ввода и может использоваться для создания кода намного легче читать.

25
ответ дан BenAlabaster 5 November 2019 в 15:23
поделиться

Краткость.

существуют дополнительные льготы для обеспечения ясности между пространствами имен, которые совместно используют имена типов, но по существу это - просто сахар.

8
ответ дан annakata 5 November 2019 в 15:23
поделиться

Очень полезно, когда у Вас есть несколько классов с тем же именем в нескольких включенных пространствах имен. Например...

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

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

можно использовать псевдонимы, чтобы сделать компилятор счастливым и сделать вещи более ясными для Вас и других в Вашей команде:

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

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();
5
ответ дан Sean Bright 5 November 2019 в 15:23
поделиться

Я всегда использую его в таких ситуациях

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

, где Utility иначе имел бы другой контекст (как MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility), но я ожидаю/предпочитаю Utility всегда указывать на тот на конкретный класс.

7
ответ дан bdukes 5 November 2019 в 15:23
поделиться

Мы определили псевдонимы пространства имен для всех наших пространств имен. Это делает очень легким видеть, куда класс прибывает из, например:

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(); 

Мы определили некоторые инструкции, как псевдонимы нужно назвать, и все используют их.

3
ответ дан M4N 5 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: