Einführung in .NETTour of .NET

.NET ist eine Entwicklungsplattform für allgemeine Zwecke..NET is a general purpose development platform. Sie bietet mehrere wichtige Features wie Unterstützung für verschiedene Programmiersprachen, asynchrone und gleichzeitige Programmiermodelle und native Interoperabilität. Dadurch wird auf unterschiedlichen Plattformen eine Vielzahl von Szenarios ermöglicht.It has several key features, such as support for multiple programming languages, asynchronous and concurrent programming models, and native interoperability, which enable a wide range of scenarios across multiple platforms.

Dieser Artikel bietet eine Einführung in einige der wichtigsten Features von .NET.This article offers a guided tour through some of the key features of the .NET. Im Thema .NET-Architekturkomponenten finden Sie Informationen zu den Bestandteilen der Architektur und deren Verwendung.See the .NET Architectural Components topic to learn about the architectural pieces of .NET and what they're used for.

Ausführen der CodebeispieleHow to run the code samples

Informationen zum Einrichten einer Entwicklungsumgebung zum Ausführen der Codebeispiele finden Sie im Thema Erste Schritte.To learn how to set up a development environment to run the code samples, see the Getting Started topic. Kopieren Sie Codebeispiele auf dieser Seite, und fügen Sie sie zum Ausführen in Ihrer Umgebung ein.Copy and paste code samples from this page into your environment to execute them.

ProgrammiersprachenProgramming languages

.NET unterstützt mehrere Programmiersprachen..NET supports multiple programming languages. Die .NET-Implementierungen implementieren die Common Language Infrastructure (CLI), die unter anderem eine sprachunabhängige Runtime und Spracheninteroperabilität angibt.The .NET implementations implement the Common Language Infrastructure (CLI), which among other things specifies a language-independent runtime and language interoperability. Dies bedeutet, dass Sie zum Erstellen von Apps und Diensten in .NET eine beliebige .NET-Sprache auswählen können.This means that you choose any .NET language to build apps and services on .NET.

Microsoft entwickelt aktiv drei .NET-Sprachen und unterstützt diese: C#, F# und Visual Basic (VB).Microsoft actively develops and supports three .NET languages: C#, F#, and Visual Basic (VB).

  • C# ist einfach, leistungsstark, typsicher und objektorientiert, behält aber gleichzeitig die Ausdruckskraft und Eleganz der C-Sprachen bei.C# is simple, powerful, type-safe, and object-oriented, while retaining the expressiveness and elegance of C-style languages. Wer sich mit C und ähnlichen Sprachen auskennt, hat wenig Probleme bei der Verwendung von C#.Anyone familiar with C and similar languages finds few problems in adapting to C#. Weitere Informationen zu C# finden Sie im Leitfaden für C#.Check out the C# Guide to learn more about C#.

  • F# ist eine plattformübergreifende, funktionsorientierte Programmiersprache, die auch die herkömmliche und imperative Programmierung unterstützt.F# is a cross-platform, functional-first programming language that also supports traditional object-oriented and imperative programming. Weitere Informationen zu F# finden Sie im Leitfaden für F#.Check out the F# Guide to learn more about F#.

  • Visual Basic ist eine einfach zu erlernende Sprache, mit der Sie eine Vielzahl von Apps erstellen können, die in .NET ausgeführt werden.Visual Basic is an easy language to learn that you use to build a variety of apps that run on .NET. Von allen .NET-Sprachen gleicht die Syntax von VB der menschlichen Sprache am meisten. Dies erleichtert den Einstieg in die Softwareentwicklung.Among the .NET languages, the syntax of VB is the closest to ordinary human language, often making it easier for people new to software development.

Automatische SpeicherverwaltungAutomatic memory management

.NET verwendet Garbage Collection (GC), um eine automatische Speicherverwaltung für Programme bereitzustellen..NET uses garbage collection (GC) to provide automatic memory management for programs. Der Garbage Collector arbeitet bei der Speicherverwaltung mit dem Prinzip der Verzögerung und gibt dem App-Durchsatz den Vorzug vor dem sofortigen Erfassen von Arbeitsspeicher.The GC operates on a lazy approach to memory management, preferring app throughput to the immediate collection of memory. Weitere Informationen zur Garbage Collection in .NET finden Sie unter Grundlagen der Garbage Collection (GC).To learn more about the .NET GC, check out Fundamentals of garbage collection (GC).

Die beiden folgenden Zeilen weisen Speicher zu:The following two lines both allocate memory:

var title = ".NET Primer";
var list = new List<string>();

Es gibt kein entsprechendes Schlüsselwort zum Aufheben der Speicherzuweisung, da diese automatisch erfolgt, wenn der Garbage Collector während seiner geplanten Ausführung Arbeitsspeicher freigibt.There's no analogous keyword to de-allocate memory, as de-allocation happens automatically when the garbage collector reclaims the memory through its scheduled run.

Der Garbage Collector ist nur einer der Dienste, die bei der Sicherstellung der Speichersicherheit helfen.The garbage collector is one of the services that help ensure memory safety. Ein Programm ist speichersicher, wenn es nur auf belegten Speicherplatz zugreift.A program is memory safe if it accesses only allocated memory. Beispielsweise stellt die Runtime sicher, dass eine App nicht auf belegten Arbeitsspeicher außerhalb des zulässigen Bereichs eines Arrays zugreift.For instance, the runtime ensures that an app doesn't access unallocated memory beyond the bounds of an array.

Im folgenden Beispiel löst die Runtime eine InvalidIndexException-Ausnahme aus, um Speichersicherheit zu erzwingen:In the following example, the runtime throws an InvalidIndexException exception to enforce memory safety:

int[] numbers = new int[42];
int number = numbers[42]; // Will throw an exception (indexes are 0-based)

Arbeiten mit nicht verwalteten RessourcenWorking with unmanaged resources

Einige Objekte verweisen auf nicht verwaltete Ressourcen.Some objects reference unmanaged resources. Nicht verwaltete Ressourcen sind Ressourcen, die nicht automatisch von der .NET-Runtime verwaltet werden.Unmanaged resources are resources that aren't automatically maintained by the .NET runtime. Ein Dateihandle ist z.B. eine nicht verwaltete Ressource.For example, a file handle is an unmanaged resource. Ein FileStream-Objekt ist ein verwaltetes Objekt, aber es verweist auf ein Dateihandle, das nicht verwaltet ist.A FileStream object is a managed object, but it references a file handle, which is unmanaged. Wenn Sie mit FileStream fertig sind, müssen Sie das Dateihandle freigeben.When you're done using the FileStream, you need to release the file handle.

In .NET implementieren Objekte, die auf nicht verwaltete Ressourcen verweisen, die IDisposable-Schnittstelle.In .NET, objects that reference unmanaged resources implement the IDisposable interface. Wenn Sie mit dem Objekt fertig sind, können Sie die Dispose()-Methode des Objekts aufrufen, die für die Freigabe nicht verwalteter Ressourcen zuständig ist.When you're done using the object, you call the object's Dispose() method, which is responsible for releasing any unmanaged resources. .NET-Sprachen stellen wie im folgenden Beispiel gezeigt eine praktische using-Syntax für solche Objekte bereit:.NET languages provide a convenient using syntax for such objects, as shown in the following example:

using System.IO;

using (FileStream stream = GetFileStream(context))
{
    // Operations on the stream
}

Sobald der using-Block abgeschlossen ist, ruft die .NET-Runtime automatisch die Dispose()-Methode des stream-Objekts auf, die das Dateihandle freigibt.Once the using block completes, the .NET runtime automatically calls the stream object's Dispose() method, which releases the file handle. Die Runtime tut dies ebenfalls, wenn eine Ausnahme das Steuerelement dazu veranlasst, den Block zu verlassen.The runtime also does this if an exception causes control to leave the block.

Weitere Einzelheiten dazu finden Sie in folgenden Themen:For more details, see the following topics:

TypsicherheitType safety

Ein Objekt ist eine Instanz eines bestimmten Typs.An object is an instance of a specific type. Die einzigen Vorgänge, die für ein bestimmtes Objekt zulässig sind, gehören zum Typ des Objekts.The only operations allowed for a given object are those of its type. Ein Dog-Typ kann Jump- und WagTail-Methoden besitzen, aber keine SumTotal-Methode.A Dog type may have Jump and WagTail methods but not a SumTotal method. Ein Programm ruft nur die Methoden auf, die zu einem bestimmten Typ gehören.A program only calls the methods belonging to a given type. Alle anderen Aufrufe führen entweder zu einem Kompilierzeitfehler oder einer Laufzeitausnahme (bei Verwendung von dynamischen Features oder object).All other calls result in either a compile-time error or a run-time exception (in case of using dynamic features or object).

.NET-Sprachen sind objektorientiert und arbeiten mit Hierarchien aus Basisklassen und abgeleiteten Klassen..NET languages are object-oriented with hierarchies of base and derived classes. Die .NET-Runtime lässt nur Objektumwandlungen und -aufrufe zu, die der Objekthierarchie entsprechen.The .NET runtime only allows object casts and calls that align with the object hierarchy. Denken Sie daran, dass jeder in einer .NET-Sprache definierte Typ vom Object-Basistyp abgeleitet ist.Remember that every type defined in any .NET language derives from the base Object type.

Dog dog = AnimalShelter.AdoptDog(); // Returns a Dog type.
Pet pet = (Pet)dog; // Dog derives from Pet.
pet.ActCute();
Car car = (Car)dog; // Will throw - no relationship between Car and Dog.
object temp = (object)dog; // Legal - a Dog is an object.

Mithilfe der Typsicherheit lässt sich auch eine Kapselung erzwingen, indem die Genauigkeit der Accessorschlüsselwörter garantiert wird.Type safety is also used to help enforce encapsulation by guaranteeing the fidelity of the accessor keywords. Accessorschlüsselwörter sind Artefakte, die den Zugriff auf Member eines bestimmten Typs durch anderen Code steuern.Accessor keywords are artifacts which control access to members of a given type by other code. Diese werden üblicherweise für verschiedene Arten von Daten innerhalb eines Typs verwendet, mit denen das Verhalten des Typs verwaltet wird.These are usually used for various kinds of data within a type that are used to manage its behavior.

private Dog _nextDogToBeAdopted = AnimalShelter.AdoptDog()

C#, VB und F# unterstützen einen lokalen Typrückschluss.C#, VB, and F# support local type inference. Ein Typrückschluss bedeutet, dass der Compiler den Typ eines Ausdrucks auf der linken Seite aus dem Ausdruck auf der rechten Seite ableitet.Type inference means that the compiler deduces the type of the expression on the left-hand side from the expression on the right-hand side. Dies bedeutet nicht, dass die Typsicherheit verletzt oder außer Kraft gesetzt wird.This doesn't mean that the type safety is broken or avoided. Der resultierende Typ besitzt einen starken Typ mit allem, was dies impliziert.The resulting type does have a strong type with everything that implies. dog und cat aus dem vorherigen Beispiel werden umgeschrieben, um einen Typrückschluss einzufügen. Der Rest des Beispiels bleibt unverändert:From the previous example, dog and cat are rewritten to introduce type inference, and the remainder of the example is unchanged:

var dog = AnimalShelter.AdoptDog();
var pet = (Pet)dog;
pet.ActCute();
Car car = (Car)dog; // will throw - no relationship between Car and Dog
object temp = (object)dog; // legal - a Dog is an object
car = (Car)temp; // will throw - the runtime isn't fooled
car.Accelerate() // the dog won't like this, nor will the program get this far

F# weist sogar noch weitergehende Funktionen für den Typrückschluss auf als nur den Typrückschluss innerhalb einer Methode wie in C# und VB.F# has even further type inference capabilities than the method-local type inference found in C# and VB. Weitere Informationen finden Sie unter Typrückschluss.To learn more, see Type Inference.

Delegaten und LambdasDelegates and lambdas

Ein Delegat wird durch eine Methodensignatur dargestellt.A delegate is represented by a method signature. Jede Methode mit dieser Signatur kann dem Delegaten zugewiesen werden und wird ausgeführt, wenn der Delegat aufgerufen wird.Any method with that signature can be assigned to the delegate and is executed when the delegate is invoked.

Delegaten ähneln C++-Funktionszeigern, sind aber typsicher.Delegates are like C++ function pointers except that they're type safe. Sie stellen eine Art separater Methode innerhalb des CLR-Typsystems dar.They're a kind of disconnected method within the CLR type system. Reguläre Methoden werden an eine Klasse angefügt und können nur über statische oder instanzaufrufende Konventionen direkt aufgerufen werden.Regular methods are attached to a class and are only directly callable through static or instance calling conventions.

Delegaten werden in .NET häufig in Ereignishandlern, beim Definieren asynchroner Vorgänge und in Lambdaausdrücken verwendet, die einer der Eckpfeiler von LINQ sind.In .NET, delegates are commonly used in event handlers, in defining asynchronous operations, and in lambda expressions, which are a cornerstone of LINQ. Weitere Informationen finden Sie im Thema Delegaten und Lambdas.Learn more in the Delegates and lambdas topic.

GenerikaGenerics

Generika ermöglichen dem Programmierer, beim Entwerfen der Klassen einen Typparameter einzuführen, über den der Clientcode (die Benutzer des Typs) den genauen Typ angeben kann, der anstelle des Typparameters verwendet werden soll.Generics allow the programmer to introduce a type parameter when designing their classes that allows the client code (the users of the type) to specify the exact type to use in place of the type parameter.

Generika wurden hinzugefügt, um Programmierer beim Implementieren generischer Datenstrukturen zu unterstützen.Generics were added to help programmers implement generic data structures. Vor der Einführung von Generika mussten Programmierer mit Elementen vom Typ object arbeiten, um z.B. den Typ List generisch zu machen.Before their arrival in order for a type such as the List type to be generic, it would have to work with elements that were of type object. Dies hat zu verschiedenen Leistungs- und Semantikproblemen sowie zu möglichen kleinen Runtimefehlern geführt.This had various performance and semantic problems, along with possible subtle runtime errors. Die bekannteste Variante solcher Fehler tritt auf, wenn eine Datenstruktur z.B. sowohl ganze Zahlen als auch Zeichenfolgen enthält und beim Arbeiten mit den Members der Liste eine InvalidCastException ausgelöst wird.The most notorious of the latter is when a data structure contains, for instance, both integers and strings, and an InvalidCastException is thrown on working with the list's members.

Das folgende Beispiel zeigt ein einfaches Programm, das unter Verwendung einer Instanz von List<T>-Typen ausgeführt wird:The following sample shows a basic program running using an instance of List<T> types:

using System;
using System.Collections.Generic;

namespace GenericsSampleShort
{
    public static void Main(string[] args)
    {
        // List<string> is the client way of specifying the actual type for the type parameter T
        List<string> listOfStrings = new List<string> { "First", "Second", "Third" };

        // listOfStrings can accept only strings, both on read and write.
        listOfStrings.Add("Fourth");

        // Below will throw a compile-time error, since the type parameter
        // specifies this list as containing only strings.
        listOfStrings.Add(1);
    }
}

Weitere Informationen finden Sie im Thema Generische Typen (Generika) – Übersicht.For more information, see the Generic types (Generics) overview topic.

Asynchrone ProgrammierungAsync programming

Die asynchrone Programmierung ist ein erstklassiges Konzept in .NET und bietet Unterstützung für asynchrone Vorgänge in der Runtime, in den Frameworkbibliotheken und in den .NET-Sprachkonstrukten.Async programming is a first-class concept within .NET with async support in the runtime, framework libraries, and .NET language constructs. Intern basiert sie auf Objekten (z.B. Task), die davon profitieren, dass das Betriebssystem E/A-gebundene Aufträge so effizient wie möglich ausführt.Internally, they're based on objects (such as Task), which take advantage of the operating system to perform I/O-bound jobs as efficiently as possible.

Erste Informationen über die asynchrone Programmierung in .NET finden Sie im Thema Async (Übersicht).To learn more about async programming in .NET, start with the Async overview topic.

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)Language Integrated Query (LINQ)

LINQ ist ein Satz leistungsstarker Features für C# und VB, mit denen Sie einfachen, deklarativen Code für Datenvorgänge schreiben können.LINQ is a powerful set of features for C# and VB that allow you to write simple, declarative code for operating on data. Die Daten können in vielfältiger Form vorliegen (als In-Memory-Objekte, in einer SQL-Datenbank oder in einem XML-Dokument), aber der LINQ-Code weicht in der Regel nicht für die verschiedenen Datenquellen ab.The data can be in many forms (such as in-memory objects, a SQL database, or an XML document), but the LINQ code you write typically doesn't differ by data source.

Weitere Informationen sowie einige Beispiele finden Sie im Thema LINQ (Language Integrated Query).To learn more and see some samples, see the LINQ (Language Integrated Query) topic.

Native InteroperabilitätNative interoperability

Jedes Betriebssystem umfasst eine Anwendungsprogrammierschnittstelle (Application Programming Interface, API), die Systemdienste bereitstellt.Every operating system includes an application programming interface (API) that provides system services. In .NET gibt es verschiedene Möglichkeiten, diese APIs aufzurufen..NET provides several ways to call those APIs.

Die wichtigste Methode, um native Interoperabilität zu erreichen, erfolgt über einen Plattformaufruf oder „P/Invoke“, der auf Linux- und Windows-Plattformen unterstützt wird.The main way to do native interoperability is via "platform invoke" or P/Invoke for short, which is supported across Linux and Windows platforms. Eine nur unter Windows verfügbare Methode zum Erreichen nativer Interoperabilität wird als „COM interop“ bezeichnet und zur Arbeit mit COM-Komponenten in verwaltetem Code verwendet.A Windows-only way of doing native interoperability is known as "COM interop," which is used to work with COM components in managed code. Die Methode basiert auf der P/Invoke-Infrastruktur, funktioniert jedoch etwas anders.It's built on top of the P/Invoke infrastructure, but it works in subtly different ways.

Der Großteil der Interoperabilitätsunterstützung von Mono (und damit auch von Xamarin) für Java und Objective-C ist gleich aufgebaut, verwendet also die gleichen Prinzipien.Most of Mono's (and thus Xamarin's) interoperability support for Java and Objective-C are built similarly, that is, they use the same principles.

Weitere Informationen dazu finden Sie im Thema Native Interoperabilität.Read more about it native interoperability in the Native interoperability topic.

Unsicherer CodeUnsafe code

Je nach Sprachunterstützung können Sie mit der CLR auf nativen Speicher zugreifen und Zeigerarithmetik über unsafe-Code ausführen.Depending on language support, the CLR lets you access native memory and do pointer arithmetic via unsafe code. Diese Vorgänge werden für bestimmte Algorithmen sowie für die Systeminteroperabilität benötigt.These operations are needed for certain algorithms and system interoperability. Unsicherer Code ist zwar leistungsstark, aber von seiner Verwendung wird abgeraten, sofern er nicht für die Interoperabilität mit System-APIs oder zur Implementierung des effizientesten Algorithmus erforderlich ist.Although powerful, use of unsafe code is discouraged unless it's necessary to interop with system APIs or implement the most efficient algorithm. Unsicherer Code wird in verschiedenen Umgebungen möglicherweise unterschiedlich ausgeführt und bietet weder die Vorteile des Garbage Collectors noch Typsicherheit.Unsafe code may not execute the same way in different environments and also loses the benefits of a garbage collector and type safety. Es wird empfohlen, die Verwendung von unsicherem Code so weit wie möglich einzugrenzen und den Code sehr gründlich zu testen.It's recommended to confine and centralize unsafe code as much as possible and test that code thoroughly.

Das folgende Beispiel zeigt die geänderte Version der ToString()-Methode aus der StringBuilder-Klasse.The following example is a modified version of the ToString() method from the StringBuilder class. Es veranschaulicht, wie sich durch Verwendung von unsafe-Code effizient ein Algorithmus implementieren lässt, indem Arbeitsspeicherblöcke direkt verschoben werden:It illustrates how using unsafe code can efficiently implement an algorithm by moving around chunks of memory directly:

public override String ToString()
{
    if (Length == 0)
        return String.Empty;

    string ret = string.FastAllocateString(Length);
    StringBuilder chunk = this;
    unsafe
    {
        fixed (char* destinationPtr = ret)
        {
            do
            {
                if (chunk.m_ChunkLength > 0)
                {
                    // Copy these into local variables so that they are stable even in the presence of ----s (hackers might do this)
                    char[] sourceArray = chunk.m_ChunkChars;
                    int chunkOffset = chunk.m_ChunkOffset;
                    int chunkLength = chunk.m_ChunkLength;

                    // Check that we will not overrun our boundaries.
                    if ((uint)(chunkLength + chunkOffset) <= ret.Length && (uint)chunkLength <= (uint)sourceArray.Length)
                    {
                        fixed (char* sourcePtr = sourceArray)
                            string.wstrcpy(destinationPtr + chunkOffset, sourcePtr, chunkLength);
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException("chunkLength", Environment.GetResourceString("ArgumentOutOfRange_Index"));
                    }
                }
                chunk = chunk.m_ChunkPrevious;
            } while (chunk != null);
        }
    }
    return ret;
}

Nächste SchritteNext steps

Wenn Sie sich für eine Einführung in die C#-Features interessieren, lesen Sie Einführung in C#.If you're interested in a tour of C# features, check out Tour of C#.

Wenn Sie sich für eine Einführung in die F#-Features interessieren, werfen Sie einen Blick auf die Einführung in F#.If you're interested in a tour of F# features, see Tour of F#.

Wenn Sie damit beginnen möchten, eigenen Code zu schreiben, lesen Sie Erste Schritte.If you want to get started with writing code of your own, visit Getting Started.

Weitere Informationen zu wichtigen Komponenten von .NET finden Sie unter .NET-Architekturkomponenten.To learn about important components of .NET, check out .NET Architectural Components.