在實作需要class, property與method名稱的功能時, 程式碼各處寫了hardcode的字串來表示這些名稱.
但總會有寫錯的時候, 也就是typo. 但是字串的typo在編譯時期無法發現問題, 只能得用測試或上線才發現.
即使單元、整合測試會通過, 但還是有一些特殊命名會讓開發者搞混, 比如username
與userName
, 這很容易被忽略, 直到QA測試或上線才抓到問題.
.NET 提供 nameof
關鍵字,可以將class, property, method與變數的命名, 在編譯時轉成字串.
甚至在用Visaul Studio的Rename功能, 也都能統一更改命名, 不會再有忘記還有哪些hardcode字串尚未變更.
有個時間函式庫NodaTime
, 提供Preconditions.CheckNotNull
函數, 其中函數宣告:
internal static class Preconditions
{
internal static T CheckNotNull<T>(T argument, [InvokerParameterName] string paramName) where T : class
{
//
}
}
而我們有個範例是需要檢查參數:
public ZonedDateTime InZone(DateTimeZone zone)
{
Preconditions.CheckNotNull(zone, nameof(zone));
// other check flow
}
在開發WPF這類的應用程式, 大都需要實作INotificationPropertyChanged
介面, 以MSDN的修改範例:
public class Person : INotifyPropertyChanged
{
private string name;
public event PropertyChangedEventHandler PropertyChanged;
public Person()
{
}
public Person(string value)
{
this.name = value;
}
public string PersonName
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
OnPropertyChanged(nameof(HighlightPersonName));
}
}
public string HighlightPersonName => $"Our customer: {PersonName}";
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
其中我們呼叫了兩筆OnPropertyChanged
, 第二筆是需要notify HighlightPersonName
property, 採用了nameof
取得property名稱.
Data mapper的知名套件AutoMapper
, 提供Attribute Mapping的方式, 在attribute設定source與target兩邊類別/property的關聯.
如它的官方範例
using AutoMapper.Configuration.Annotations;
[AutoMap(typeof(Order))]
public class OrderDto
{
[SourceMember(nameof(Order.OrderTotal))]
public decimal Total { get; set; }
// ...
}
可以看到, SourceMember
內代入nameof
, 取得Order
的property OrderTotal
命名