2017-03-01 94 views
0

我有一個類,並將UID設置爲一個類屬性,因爲它在整個程序中的許多方法中使用,我不想不斷地傳遞一個值給它。我得到的問題是,當我運行context.Response.Write(uid)並刷新頁面時,每次都獲得相同的值。獲取緩存的C#類屬性?

如果我將createRandomString()移動到context.Response.Write(createRandomString()),我每次重新加載時都會得到一個新的UID。

我對使用C#和來自PHP背景很陌生,這對我來說有點奇怪。我認爲設置一個類屬性會改變每一個負載。我認爲這可能與程序編譯時有關係,UID永久設置,但仍然沒有意義。財產是越來越設置

代碼:

public class Emailer : IHttpHandler { 
    // Define UID 
    static string uid = createRandomString(); 

CreateRandomString代碼:

public static string createRandomString() { 
    Guid g = Guid.NewGuid(); 
    string GuidString = Convert.ToBase64String(g.ToByteArray()); 
    GuidString = GuidString.Replace("=", ""); 
    GuidString = GuidString.Replace("+", ""); 

    return GuidString; 
} 
+4

你uid屬性是一個靜態屬性,因此只加載時再次訪問一次,並且不會刷新。 – invalidusername

+0

@invalidusername這是那些日子之一......我不明白它是如何在每次頁面重新加載時都沒有得到重置的。它是否像我想的那樣在編譯之後立即被設置? –

+0

此外,這意味着你的領域(不是屬性雖然)只是初始化,當你第一次使用任何其成員引用你的類時,或者當第一次時該類是instantaited。這通常只發生一次。 – HimBromBeere

回答

0

通過保持字段靜態但在加載時設置值來解決此問題。

領域:

// Define UID 
static string uid = ""; 

// Define upload path for files 
static string uploadPath = ""; 

設置:

// Define UID 
uid = createRandomString(); 
uploadPath = @"c:\" + uid + @"\"; 
+1

爲什麼你認爲你需要成員是'靜態'?從你所描述的我打賭他們不應該。 – HimBromBeere

0

靜態字段只instansiated一次。這就是爲什麼你總是得到相同的結果。試試這個...

public class Emailer : IHttpHandler 
{ 
    // Define UID 
    string uid => createRandomString(); 
} 

https://msdn.microsoft.com/en-us/library/aa645751(v=vs.71).aspx

+0

我使用uid將我的上傳路徑設置爲另一個字段。兩者都是靜態的,我能在這裏做什麼? –

+1

停止使用靜態,除非它是適當的。 –

0

靜態類級別成員的初始化器都只有一次在第一時間類(靜態或其他方式)的任何memeber被引用。

初始化將只在包含該類的程序集從內存中卸載時(例如卸載可執行程序時)纔會重新運行。

對於ASP應用程序,程序集由IIS進程加載和卸載,因此如果重新啓動IIS進程(例如),將導致生成新的UID。

+0

有沒有辦法強制它重置每個負載? –

+1

@JoeScotto通過不使其靜態 – Nkosi

+0

@JoeScotto或通過使它不是一個屬性/字段的方法,例如 - public static Guid GetNewOne(){return Guid.NewGuid(); } – SpaceUser7448