1

我最近在 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”感到不安,它也写在<和>之间。如果我能理解它,我应该能够将属性设置为默认值,我将在我的程序开始时执行此操作。任何提示表示赞赏。谢谢你。

4

3 回答 3

6

我对“T”感到不安,它也写在<和>之间。

这表明它是一个泛型方法

基本上,如果不阅读有关generics的内容,您将无法理解它,这是一个太大的话题,无法在 Stack Overflow 答案中充分涵盖。按照 MSDN 指南的链接 :)

非常简短的版本是这意味着该方法由类型和值参数化。泛型可以应用于类型和方法,因此 aList<string>是“字符串列表”,而 aList<int>是“整数列表”。泛型方法类似,但稍微难以理解——这里GetValueOrDefault可以描述为“根据给定的字符串键返回一个类型的值——或者如果设置中不存在该键,则T返回提供的默认值(也是类型) T。”

SoGetValueOrDefault<string>(key, "foo")将从设置中返回 a string,默认为"foo",并将从设置中GetValueOrDefault<int>(key, 10)返回 an int,默认为10

不过,这只是 30 秒的演练——还有很多东西要学:)

于 2013-02-20T17:08:23.210 回答
0

这是泛型的语法。

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

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

你只写一个:

T GetValueOrDefault<T>(string Key, T defaultValue)
于 2013-02-20T17:13:15.407 回答
0

这称为泛型

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

List<int> intList; // a list of int
List<string> stringList; // a list of strings
于 2013-02-20T17:09:19.907 回答