C Sharp 3.0

**[[C Sharp|C#]] 3.0** var hleypt af stokkunum 19. nóvember 2007 og er byggt ofaná C# 2.0.  Það eru kynntar nokkrar viðbætur við málið sem eru byggðar ofaná C# 2.0 til að styðja við notkun á fallaforritun, vinsæl fallforitunarmál eru MON LISP, ML og Haskel.  Einnig er nýtt í 3.0 Language Integrated Query (LINQ). LINQ er ein leið til að skilgreina eða gera fyrirspurnir á gögn. C# 3.0 inniheldur eftirfarandi viðbætur:

## Nafnlausar týpur (''Anonymous Types'')
Nafnlausar týpur eru ekki skilgreindar sem ákveðnir klasar.  Þegar þú býrð til nafnlausa týpu mun þýðandinn búa til klasa fyrir þig.  Nafnlaus týpa erfir beint frá object.  Innihaldið í nafnlausu týpunni er röð af les/skrif eiginleikum (property) þar sem þýðandinn sér um að frumstilla nafnlausu breyturnar. 


```csharp
var x = new { Property1 = "hello", Property2 = 5 };
  Console.WriteLine(x.Property1);
  Console.WriteLine(x.Property2.ToString());
```


## Óbein týpa af breytu (''Implicitly Typed Local Variables'')
Skilgreining á óbeinni týpu af breytu er ályktuð frá segðinni sem er notuð til að skilgreina breytuna. Þegar staðtengd breyta er skilgreind með "var" sem týpu þá er hún skilgreind sem óbein týpa af breytu. Dæmi:


```csharp
var i = 5;
  var s = "Hello";
  var d = 1.0;
  var numbers = new int[] {1, 2, 3};
  var orders = new Dictionary<int,Order>();
```


Þessar óbeint skilgreindu breytur eru nákvæmlega eins og eftirfarandi skilgreining:


```csharp
int i = 5;
  string s = "Hello";
  double d = 1.0;
  int[] numbers = new int[] {1, 2, 3};
  Dictionary<int,Order> orders = new Dictionary<int,Order>();
```

  
## Hlut frumstillir (''Object Initializer'')
Í C# 2.0 þegar það þurftir að búa til hlut og setja stöðu á hann varða að fjölbinda (overload) smiðinn og setja breyturnar úr smiðnum. Í C# 3.0 er hægt að gera þetta á nýjan hátt.

C# 2.0:

```csharp
MyClass c = new MyClass();
  c.Prop = "asdads";
</syntaxhighlight >

C# 3.0:
<syntaxhighlight lang="csharp">
  MyClass c = new MyClass { Prop = "test" };
```


## Óbeinar fylkis týpur (''Implicitly Typed Arrays'')
Óbeinar fylkis týpu framsemsetningar eru gerðar með því að þeir liðir sem eru í fylkinu eru ályktaðir út frá þeim liðum sem eru í fylkinu.  

Eftirfarandi eru skilgreiningar á óbeinum týpum af fylki:


```csharp
var a = new[] { 1, 10, 100, 1000 };            // int[]
  var b = new[] { 1, 1.5, 2, 2.5 };            // double[]
  var c = new[] { "hello", null, "world" };      // string[]
  var d = new[] { 1, "one", 2, "two" };         // Error
```


## Viðbótaraðgerðir (''Extenstion Methods'')

Hægt er að bæta við aðgerðum við aðra klasa, eins og að bæta við string týpuna aðgerð.  Strengja týpan er í System.dll og þú hefur ekki aðgang þar inn að kóða en hægt er að skilgreina viðbótaraðgerð þar inn.  Aðgerðin eða fallið verður að vera skilgreint sem static fall í static klasa. 

Dæmi um þetta:


```csharp
static class StrenjaVidbot
  {
     public static string BaetaNafniVidStreng(this string value)
     {
        return value + " Jónsson";
     }
   }
```

Svo er hægt að nota þetta á þessa leið:

```csharp
String strName = "Jón"
   Console.WriteLine(strName.AppendMyNameToString());
```


## Lambda-framsetning (''Lambda Expressions'')
Lamda-framsetning er hnitmiðuð framsetning til að skrifa nafnlausar aðgerðir sem geta innihaldið segðir og staðhæfingar.  Allar lambda segðir nota virkjann => . Vinstra megin eru skilgreindar þær breytur sem eru notaðar í inntaki og á hægri hlið er framsetningin eða skilgreining á aðgerðinni. 

Í C# 2.0 voru kynntar nafnlausar aðgerðir, hér er dæmi um eina:

```csharp
public delegate int MinDelegate(int n);
   class NafnlausAdgerð
   {
      static void Main()
      {
         // Nafnlaus aðgerð sem skilar margfeldi með 10
         MinDelegate delegHlutur = new MinDelegate( delegate(int n) { return n * 10; } );
        // Skrifa útkomnuna:
        Console.WriteLine("Útkoman er: {0}", delegHlutur(5));
     }
   }
```

Lamda-framsetningin í C# 3.0


```csharp
public delegate int MinDelegate(int n);
   class LambdaFrams
   {
      static void Main()
      {
          // Nafnlaus aðgerð sem skilar margfeldi með 10
          MinDelegate Hlut1= new MinDelegate( delegate(int n) { return n * 10; } );
          // Skrifa útkomuna:
          Console.WriteLine("Útkoman í 2.0: {0}", Hlut1(5));
          // Lambda framsetning:
          MinDelegate Hlut2 = (int n) => n * 10;
          // Eða:
          // MyDelegate Hlut2 = n => n * 10;
          // Skrifa útkomuna:
          Console.WriteLine("Lambda útkoman: {0}", Hlut2(5));
          Console.ReadLine();
      }
   }
```


## Fyrirspurnarframsetning (''Query expressions'')
Núna er hægt að nota fyrirspurnir svipaðar og eru í vensluðum gagnagrunnum eins og SQL og XQuery, málið er kallað Language Integrated Query eða (LINQ). Eitt af aðalmarkmiðum C# 3.0 var einmitt að auðvelda vinnu með gögn og að nálgast gagnagruna á auðveldari hátt.  

Þetta dæmi prentar lista af öllum vörum sem eru uppseldar.  Fyrirspurnin velur hvert stak úr vörulistanum þar sem "UnitsInStock" er jafnt og 0.


```csharp
public void Linq2() {
      List products = GetProductList();
      var soldOutProducts =
          from p in products
          where p.UnitsInStock == 0
          select p;
    
      Console.WriteLine("Sold out products:");
      foreach (var product in soldOutProducts) {
          Console.WriteLine("{0} is sold out!", product.ProductName);
    }
  }
```


## Heimildir
* 
* 
* 
* 
* 
* 
* mars 2008