这个[字符串键]是什么意思

时间:2016-07-20 07:13:18

标签: c#

我查看了来自IRequestCookieCollection程序集的Microsoft.AspNetCore.Http代码:

  //
  // Summary:
  //     Represents the HttpRequest cookie collection
  [DefaultMember("Item")]
  public interface IRequestCookieCollection : IEnumerable<KeyValuePair<string, string>>, IEnumerable
  {
    //
    // Summary:
    //     Gets the value with the specified key.
    //
    // Parameters:
    //   key:
    //     The key of the value to get.
    //
    // Returns:
    //     The element with the specified key, or string.Empty if the key is not present.
    //
    // Exceptions:
    //   T:System.ArgumentNullException:
    //     key is null.
    //
    // Remarks:
    //     Microsoft.AspNetCore.Http.IRequestCookieCollection has a different indexer contract
    //     than System.Collections.Generic.IDictionary`2, as it will return string.Empty
    //     for missing entries rather than throwing an Exception.
    string this[string key] { get; }

    //
    // Summary:
    //     Gets the number of elements contained in the Microsoft.AspNetCore.Http.IRequestCookieCollection.
    //
    // Returns:
    //     The number of elements contained in the Microsoft.AspNetCore.Http.IRequestCookieCollection.
    int Count { get; }
    //
    // Summary:
    //     Gets an System.Collections.Generic.ICollection`1 containing the keys of the Microsoft.AspNetCore.Http.IRequestCookieCollection.
    //
    // Returns:
    //     An System.Collections.Generic.ICollection`1 containing the keys of the object
    //     that implements Microsoft.AspNetCore.Http.IRequestCookieCollection.
    ICollection<string> Keys { get; }

    //
    // Summary:
    //     Determines whether the Microsoft.AspNetCore.Http.IRequestCookieCollection contains
    //     an element with the specified key.
    //
    // Parameters:
    //   key:
    //     The key to locate in the Microsoft.AspNetCore.Http.IRequestCookieCollection.
    //
    // Returns:
    //     true if the Microsoft.AspNetCore.Http.IRequestCookieCollection contains an element
    //     with the key; otherwise, false.
    //
    // Exceptions:
    //   T:System.ArgumentNullException:
    //     key is null.
    bool ContainsKey(string key);
    //
    // Summary:
    //     Gets the value associated with the specified key.
    //
    // Parameters:
    //   key:
    //     The key of the value to get.
    //
    //   value:
    //     The key of the value to get. When this method returns, the value associated with
    //     the specified key, if the key is found; otherwise, the default value for the
    //     type of the value parameter. This parameter is passed uninitialized.
    //
    // Returns:
    //     true if the object that implements Microsoft.AspNetCore.Http.IRequestCookieCollection
    //     contains an element with the specified key; otherwise, false.
    //
    // Exceptions:
    //   T:System.ArgumentNullException:
    //     key is null.
    bool TryGetValue(string key, out string value);
  }

并无法理解声明

this[string key]

装置。有人可以解释一下。

4 个答案:

答案 0 :(得分:10)

它是indexer。它定义了一个索引属性,可以使用objectName["key"]来访问对象的集合,例如Dictionary<string,T>

实现可能如下所示:

string this[string key]
{ 
    get{return _internalDictionary[key];}
}

或者这个:

string this[string key]
{ 
    get
    {
        switch(key)
        {
            case "Length":
                return this.Length;
            case "Timeout":
                return this.Timeout.ToString();
            case "Version":
                return "1.5.0";
        }
        return null;
    }
}

答案 1 :(得分:3)

这就像一种方法,但不同

这实际上只是一种特殊的功能。例如,想象你有这个类:

class MyClass {
    public string GetValue(string name) {
        switch(key)
        {
            case "Name":
                return "John";
            case "Age":
                return 30;
        }
    }
}

您调用此代码的方式当然是:

// Calling a regular method
var instance = new MyClass();
var value = instance.GetValue("Name");
Console.WriteLine(value);
// Output: John

现在更改一些内容,以便您使用“索引器”语法。

class MyClass {
    // Instead of using the method name, use the "this" keyword.
    // Instead of parenthesis use square brackets

    // OLD: public string GetValue(string name) {

    public string this[string name] {
        switch(key)
        {
            case "Name":
                return "John";
            case "Age":
                return 30;
        }
    }
}

现在你要调用这样的代码:

// Calling a regular method
var instance = new MyClass();

// Remove the dot (.) and the function name
// Instead of parenthesis use square brackets

// OLD: var value = instance.GetValue("Name");
var value = instance["Name"];

Console.WriteLine(value);
// Output: John

什么时候应该使用索引器而不是方法?

随时随地。只要你觉得它有意义。它通常在对象存储动态值(如Dictionary&lt;,&gt;)时使用,或者当您希望它的行为类似于List&lt;&gt;这样的数组时使用。

答案 2 :(得分:1)

它是一个Indexer,允许对象像数组一样被索引。

public class MyIndexer
    {
        private string[] myData;
        public string this[int ind]
        {
            get
            {
                return myData[ind];
            }
            set
            {
                myData[ind] = value;
            }
        }
    }

public class UseIndex
    {
        public void UseIndexer()
        {            
            MyIndexer ind = new MyIndexer();

            ind[1] = "Value 1";
            ind[2] = "Value 2";
            ind[3] = "Value 3";    
            ind[4] = "Value 4";    
            ind[5] = "Value 5";    
        }
    }

答案 3 :(得分:0)

这意味着实现对象将是一个在字符串上索引的集合。例如,字典。