C# Language
C # 4.0 Funktioner
Sök…
Valfria parametrar och namngivna argument
Vi kan utelämna argumentet i samtalet om det argumentet är ett valfritt argument Varje valfritt argument har sitt eget standardvärde Det kommer att ta standardvärde om vi inte tillhandahåller värdet Ett standardvärde för ett valfritt argument måste vara ett
- Konstant uttryck.
- Måste vara en värdetyp som enum eller struktur.
- Måste vara ett uttryck för standardformuläret (valueType)
Det måste ställas in i slutet av parameterlistan
Metodparametrar med standardvärden:
public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
{
//...
}
Som sagt av MSDN, Ett namngivet argument,
Gör att du kan skicka argumentet till funktionen genom att koppla parameterns namn Inga behov för att komma ihåg parametrarnas position som vi inte är medvetna om alltid. Du behöver inte leta efter parametrarnas ordning i parameterns lista över kallad funktion. Vi kan ange parameter för varje argument med dess namn.
Namngivna argument:
// required = 3, optValue = "test", optNum = 4
ExampleMethod(3, optNum: 4);
// required = 2, optValue = "foo", optNum = 42
ExampleMethod(2, optValue: "foo");
// required = 6, optValue = "bar", optNum = 1
ExampleMethod(optNum: 1, optValue: "bar", required: 6);
Begränsning av att använda ett namngivet argument
Namngivna argumentspecifikationer måste visas efter att alla fasta argument har angetts.
Om du använder ett namngivet argument före ett fast argument får du ett sammanställningstidsfel enligt följande.
Namngivna argumentspecifikationer måste visas efter att alla fasta argument har angetts
Variation
Generiska gränssnitt och delegater kan ha sina typparametrar markerade som covariant eller contravariant med hjälp av out
respektive in
nyckelord. Dessa deklarationer respekteras sedan för typkonverteringar, både implicita och uttryckliga, och båda sammanställer tid och körtid.
Exempelvis har det befintliga gränssnittet IEnumerable<T>
omdefinierats till att vara kovariant:
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
Det befintliga gränssnittet IComparer har omdefinierats som kontroversiellt:
public interface IComparer<in T>
{
int Compare(T x, T y);
}
Valfritt ref-nyckelord när du använder COM
Ref-nyckelordet för samtal av metoder är nu valfritt när du ringer till metoder som tillhandahålls av COM-gränssnitt. Får en COM-metod med signaturen
void Increment(ref int x);
kallelsen kan nu skrivas som endera
Increment(0); // no need for "ref" or a place holder variable any more
Dynamisk medlemsuppslag
En ny dynamic
pseudotyp introduceras i systemet C #. Det behandlas som System.Object
, men dessutom System.Object
alla medlemmar åtkomst (metod samtal, fält, egendom eller indexer tillgång, eller en delegat anrop) eller tillämpning av en operatör på ett värde av en sådan typ utan någon typkontroll, och dess resolution skjuts upp till körtid. Detta är känt som anka typning eller sen bindning. Till exempel:
// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}
GetLength("Hello, world"); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown
// in GetLength method at run-time
I det här fallet används dynamisk typ för att undvika mer verbal reflektion. Den använder fortfarande Reflektion under huven, men den är vanligtvis snabbare tack vare cache.
Denna funktion är främst inriktad på interoperabilitet med dynamiska språk.
// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");
// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();
Dynamisk typ har applikationer även i mestadels statiskt typad kod, till exempel gör den dubbla avsändningar möjlig utan att implementera besöksmönster.