通用方法如何工作?

时间:2013-02-20 17:05:47

标签: c# generics

我最近在MSDN上学习了这个教程,允许我的应用程序的用户更改和保存设置。经过一番头疼之后我觉得我理解了所有这一切,除了一件事。让我们从原始代码中最相关的部分开始。一切都在一个名为AppSettings的类中。我用来测试它的属性是son1。我的理解是:

在代码的最后,你得到了这个:

 // Property to get and set son1 Key.
    public int son1
    {
        get
        {
            return GetValueOrDefault<int>(son1KeyName, son1Default);
        }
        set
        {
            if (AddOrUpdateValue(son1KeyName, value))
            {
                Save();
            }
        }
    }

如果设置属性,则很容易。它只是调用这个方法:

public bool AddOrUpdateValue(string Key, Object value)
    {
        bool valueChanged = false;
 // If the key exists
        if (settings.Contains(Key))
        {
            // If the value has changed
            if (settings[Key] != value)
            {
                // Store the new value
                settings[Key] = value;
                valueChanged = true;
            }
        }
        // Otherwise create the key.
        else
        {
            settings.Add(Key, value);
            valueChanged = true;
        }
        return valueChanged;
    }

我必须这样做而且我已经完成了:

AppSettings param = new AppSettings();
        param.son1 = 1;

现在GET的语法对我来说似乎更奇怪。过程是相同的,属性使用方法。 get属性列在我的帖子顶部。如您所见,它调用此方法:

public T GetValueOrDefault<T>(string Key, T defaultValue)
    {
        T value;

        // If the key exists, retrieve the value.
        if (settings.Contains(Key))
        {
            value = (T)settings[Key];
        }
        // Otherwise, use the default value.
        else
        {
            value = defaultValue;
        }
        return value;
    }

我对“T”感到不安,“T”也写在&lt;和&gt;。如果我能理解它,我应该能够将属性设置为默认值,我可以在我的程序开始时做。任何小费都表示赞赏。谢谢。

3 个答案:

答案 0 :(得分:6)

  

我对“T”感到不安,“T”也写在&lt;和&gt;。

这表明它是泛型方法

基本上,如果没有阅读generics,那么你就不会理解它,这是太大的主题,无法在Stack Overflow答案中充分涵盖。请按照MSDN指南的链接进行操作:)

very 简要版本是指该方法由类型以及值参数化。泛型可以应用于类型和方法,因此List<string>是“字符串列表”而List<int>是“整数列表”。通用方法类似,但稍微难以理解 - 此处GetValueOrDefault可以描述为“基于给定的字符串键返回类型T的值 - 或返回提供的默认值(也是类型) T)如果设置中不存在密钥。“

因此GetValueOrDefault<string>(key, "foo")将从设置返回string,默认为"foo"GetValueOrDefault<int>(key, 10)将从设置返回int,默认为{ {1}}。

这只是通过30秒的步行 - 有一个很多了解更多:)

答案 1 :(得分:0)

这称为Generics

泛型的一个突出例子是List<T>,它接受​​任何类型并充当该类型对象的容器。

List<int> intList; // a list of int
List<string> stringList; // a list of strings

答案 2 :(得分:0)

这是generics的语法。

这是一个复杂的主题,但它只是几句话:它基本上意味着你的方法可以用于多种类型。为简化起见,您可以用任何类型替换T. 而不是编写多个函数:

public string GetValueOrDefault(string Key, string defaultValue)
public int GetValueOrDefault(string Key, int defaultValue)

你只写一个:

T GetValueOrDefault<T>(string Key, T defaultValue)