Следите за методами реагирования на жизненный цикл!
Я работал несколько часов, чтобы узнать, что getDerivedStateFromProps
будет вызван после каждого setState()
.
Это - псевдоним типа, не псевдоним пространства имен; полезно снять неоднозначность - например, против:
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) { }
}
}
В дополнение к упомянутым примерам введите псевдонимы (а не псевдонимы пространства имен) может быть удобным при повторном обращении к универсальным типам:
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) {}
Я использую его, когда у меня есть несколько пространств имен с конфликтом 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();
Это сохраняет тонну ввода и может использоваться для создания кода намного легче читать.
Краткость.
существуют дополнительные льготы для обеспечения ясности между пространствами имен, которые совместно используют имена типов, но по существу это - просто сахар.
Очень полезно, когда у Вас есть несколько классов с тем же именем в нескольких включенных пространствах имен. Например...
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();
Я всегда использую его в таких ситуациях
using Utility = MyBaseNamespace.MySubNamsepace.Utility;
, где Utility
иначе имел бы другой контекст (как MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility
), но я ожидаю/предпочитаю Utility
всегда указывать на тот на конкретный класс.
Мы определили псевдонимы пространства имен для всех наших пространств имен. Это делает очень легким видеть, куда класс прибывает из, например:
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();
Мы определили некоторые инструкции, как псевдонимы нужно назвать, и все используют их.