2009-12-14 43 views
0

我的代碼中是否有任何邏輯問題,需要優化的任何東西?我的代碼中是否有任何邏輯問題,需要優化的任何東西?

在這段代碼中,我從註冊表中獲取值。我在這裏創建了一個屬性。我在不同的文件中獲取該屬性。這裏我們是否需要set訪問器? 值在註冊表中已修復。

public class Agent 
{ 
    public string version 
    { 
     get { return m_version; } 
     set { m_version = value; } 
    } 

    private string m_version = null; 

    // constructor 
    public Agent() 
    { 
     string keySpoPath = SpecialRegistry.SpecialAgentRoot; 
     RegistryKey regkey = Registry.LocalMachine.OpenSubKey(keySpoPath); 
     m_version = 
      (string)regkey.GetValue(SpecialRegistry.regValue_CurrentVersion); 
    } 
} 
+0

您確定此代碼是性能瓶頸嗎?如果沒有,*不要嘗試「優化」*。 – 2009-12-14 06:19:09

+0

不,但我只是想知道屬性的用法,雖然它在這裏是強制性的,任何方式的功能工作都很好。我只是想知道屬性的用法(SET訪問器是必需的嗎?) 和decalration我在做什麼構造函數 – peter 2009-12-14 06:24:06

+0

您應該在使用它之後處置該regkey,或將其放入使用(RegistryKey regkey = ...){...}語句中。 – treaschf 2009-12-14 06:32:21

回答

0

除非你希望值從外部類改變,後來更新註冊表,NO,你不需要一個引領者。

0

不。如果您不希望從其他文件更新值,只需提供get訪問器即可。

0

問題是價值是否改變,你需要將它保存回註冊表?或者,註冊表中的值始終是正確的,從不更新?

一審:

私人支持字段:

private static HorizontalAlignment? _Alignment; 

屬性:

public static HorizontalAlignment Alignment 
    { 
     get 
     { 
      if (_Alignment == null) 
      { 
       _Alignment = GetAlignment(); 
      } 

      return _Alignment.Value; 
     } 
     set 
     { 
      if (_Alignment != value && SetAlignment(value)) 
      { 
       _Alignment = value; 
       OnAlignmentChanged(new AlignmentChangedEventArgs(value)); 
      } 
     } 
    } 

「獲取」 的方法:

private static HorizontalAlignment GetAlignment() 
    { 
     HorizontalAlignment alignmentValue = DEFAULT_ALIGNMENT; 

     using (RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(REGISTRYKEY)) 
     { 
      if (registryKey != null) 
      { 
       string tempAlignment = registryKey.GetValue(ALIGNMENT_KEYNAME, string.Empty).ToString(); 

       if (!string.IsNullOrEmpty(tempAlignment)) 
       { 
        try 
        { 
         alignmentValue = (HorizontalAlignment)Enum.Parse(typeof(HorizontalAlignment), tempAlignment, false); 
        } 
        catch (Exception exception) 
        { 
         alignmentValue = DEFAULT_ALIGNMENT; 
         Logging.LogException(exception); 
        } 
       } 
      } 
     } 

     return alignmentValue; 
    } 

的「設置「方法:

private static bool SetAlignment(HorizontalAlignment value) 
    { 
     bool flag = true; 

     using (RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(REGISTRYKEY)) 
     { 
      if (registryKey != null) 
      { 
       try 
       { 
        registryKey.SetValue(ALIGNMENT_KEYNAME, value.ToString(), RegistryValueKind.String); 
       } 
       catch (Exception exception) 
       { 
        Logging.LogException(exception); 
        flag = false; 
       } 
      } 
     } 

     return flag; 
    } 

如果您的問題是「是否需要實現Set訪問器?」那麼答案是否定的。以下內容也是有效的。

public int MyInt { get { return 1; } } 

public int MyInt { get; protected set; } 
0

你可以拉出來keySpoPath,使其靜態,或只讀,因爲它似乎是每次調用代理不變。對於這個問題,regkey可以被撤出並且只做一次。如果它正在改變,我會留下來,否則它也可以靜態完成。

0

使用後處理RegistryKey。 除非您需要,否則不要緩存。 不要害怕硬編碼註冊表鍵名 - 它們很可能只在一個地方使用。

public class Agent 
{ 
    public string Version 
    { 
     get 
     { 
      using (var regkey = Registry.LocalMachine.OpenSubKey(SpecialRegistry.SpecialAgentRoot)) 
       return (string)regkey.GetValue("CurrentVersion"); 
     } 
    } 
} 
相關問題