簡體   English   中英

C#中相同功能的靜態和非靜態版本

[英]Static and non-static version of the same function in C#

我將自己的GetUserId()函數實現為靜態,以便能夠在靜態上下文中檢索ID。 但是我在很多地方都使用內置在asp.net UserManager庫中的標准GetUserId()函數。 對於不對同一事物使用不同邏輯的解決方法是重寫非靜態方法,並在其中使用靜態方法(這在UserManagerService類內部):

public override string GetUserId(ClaimsPrincipal user)
{
    return GetUserIdStatic(user);
}

public static string GetUserIdStatic(ClaimsPrincipal user)
{
    return user.FindFirst(ClaimTypes.NameIdentifier).Value;
}

我這樣做是因為我更喜歡在非靜態上下文中調用非靜態方法(通常占調用的90%以上)。 因此,我盡可能地調用_userManagerService.GetUserId(User)不是UserManagerService.GetUserIdStatic(User)

從可讀性和可維護性的角度(以及我現在無法預料的最終有害后果)來看,采用上述方法更好。 將所有呼叫切換到靜態版本; 還是其他我沒想到的方式?

制作執行相同操作的方法的靜態和非靜態版本非常有問題。

您應將靜態方法替換為靜態方法以獲取用戶ID,或將靜態屬性替換為靜態屬性以獲取用戶管理器服務。 這樣,您可以通過調用非靜態方法在靜態上下文中獲取用戶ID:

var userId = StaticGetUserManagerSerice().GetUserIdStatic(user);

要么

var userId = UserManagerSerice.Instance.GetUserIdStatic(user);

首先,不清楚要在哪個類中放入此靜態和非靜態方法。

看來您的方法就是所謂的“純函數”,即無論輸入內容如何,​​它都會簡單地返回相同的結果,並且沒有副作用。 在這種情況下,它並沒有真正意義的方法是一個實例,因為它不實例的數據處理。 因此,從該角度來看,應將調用設為靜態。

但是,按照OOP原則,此方法的最佳位置似乎是作為非靜態方法的User類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM