What does this [string key] mean

I looked at the code IRequestCookieCollectionfrom the Microsoft.AspNetCore.Httpassembly:

  //
  // 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);
  }

and could not understand what the statement means

this[string key]

means. Can someone please explain to me.

+4
source share
4 answers

This is an indexer . It defines an indexed property that can be used to access the collection of an object using objectName["key"], for example, a Dictionary<string,T>.

An implementation might look something like this:

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

Or that:

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;
    }
}
+9
source

This is an Indexer that allows you to index an object as an array.

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";    
        }
    }
+1
source

,

. , , :

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

, "indexer".

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

When should I use an index instead of a method?

Whenever you want. Whenever you feel it makes sense. It is commonly used when an object stores dynamic values, such as Dictionary <,>, or when you want it to behave like an array, such as List <>.

+1
source

This means that the implementation object will be a collection indexed on a string. For example, a dictionary.

0
source

Source: https://habr.com/ru/post/1648464/


All Articles