C# Academy · Oppitunti

unmanaged, notnull ja new() (C# 6 -jäljitelmä)

C# 6 tukee class-, struct- ja new()-rajoitteita. Jäljitelkää uudempia notnull- ja unmanaged-rajoitteita tarkistuksilla, rajapinnan rakenteella ja käytännöillä.

Oppitunti 1/38 vaihetta

unmanaged, notnull ja new() (C# 6 -jäljitelmä) on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 3 oppituntia.

Tyyppirajoitteiden kokonaisuus

Tavoite: Käyttäkää C# 6:n geneerisiä tyyppirajoitteita tehokkaasti.

  • class ja struct
  • new() luomiseen ilman Activatoria
  • Jäljitellään notnull- ja unmanaged-rajoitteita tarkistuksilla ja API-suunnittelulla

class ja struct

class rajoittaa T:n viitetyyppeihin ja struct arvotyyppeihin. Virheellinen käyttö havaitaan käännösaikana.

using System;

// Works only for reference types
public static class RefBox
{
  public static string Show<T>(T value) where T : class
  {
    return value == null ? "null ref" : "ref: " + value.ToString();
  }
}

// Works only for value types
public static class ValBox
{
  public static string Show<T>(T value) where T : struct
  {
    return "value: " + value.ToString();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    string s = "hello";
    int n = 42;

    Console.WriteLine(RefBox.Show<string>(s)); // OK
    Console.WriteLine(ValBox.Show<int>(n));    // OK

    // Console.WriteLine(RefBox.Show<int>(n)); // compile-time error (int is struct)
    // Console.WriteLine(ValBox.Show<string>(s)); // compile-time error (string is class)
  }
}

new() käytännössä

new() takaa julkisen parametrittoman konstruktorin, joten geneerinen koodi voi kutsua suoraan new T().

using System;

// Requires public parameterless ctor on T
public static class Factory
{
  public static T Create<T>() where T : new()
  {
    return new T(); // safe in C# 6 with new()
  }
}

public sealed class Sample
{
  public string Name { get; set; }
  public Sample() { Name = "default"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Sample x = Factory.Create<Sample>();
    Console.WriteLine("Created: " + x.Name);
  }
}

notnull-rajoitteen jäljittely

C# 6:ssa ei ole notnull-rajoitetta. Sitä voidaan lähestyä käyttämällä where T : class -rajoitetta ja lisäämällä API:n sisälle eksplisiittiset null-guardit.

using System;

// C# 6 has no notnull constraint. Use where T : class and guard at runtime.
public static class NotNullApi
{
  public static int LengthOf<T>(T x) where T : class
  {
    if (x == null) throw new ArgumentNullException("x");
    return x.ToString().Length; // placeholder usage
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NotNullApi.LengthOf<string>("hi")); // 2
    try
    {
      Console.WriteLine(NotNullApi.LengthOf<string>(null)); // throws
    }
    catch (Exception ex)
    {
      Console.WriteLine("Guard fired: " + ex.GetType().Name);
    }
  }
}

unmanaged-tavoitteen jäljittely

C# 6:ssa ei ole unmanaged-rajoitetta. struct-rajoitteen ja rajapintojen (esimerkiksi IComparable) avulla voidaan kohdistaa käsittely numeerisen kaltaisiin arvotyyppeihin.

using System;

// No unmanaged constraint in C# 6.
// Use struct for value types and restrict API usage (document numeric-only intent).
public static class NumericOps
{
  public static T Max<T>(T a, T b) where T : struct, IComparable
  {
    // Works for numeric primitives because they implement IComparable
    return (a.CompareTo(b) >= 0) ? a : b;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NumericOps.Max<int>(3, 9));     // 9
    Console.WriteLine(NumericOps.Max<double>(2.5, 2)); // 2.5
  }
}

Käytännön vinkit

Vinkit:

  • Valitkaa class/struct, jotta T:n tyyppiä voidaan rajoittaa ajoissa.
  • Käyttäkää new()-rajoitetta, jos T täytyy luoda.
  • Jäljiteltäkää notnull-rajoitetta ajonaikaisilla tarkistuksilla.
  • Jäljiteltäkää unmanaged-tavoitetta struct-rajoitteella ja dokumentoidulla käytöllä (usein numeerisilla perustyypeillä).

Konstruktorirajoite

Pikatarkistus: mikä C# 6:n rajoite edellyttää tyyppiparametrin tyypiltä julkista parametritonta konstruktoria?

Kertaus

Kertaus: Käyttäkää C# 6:ssa rajoitteita class/struct/new(). Jäljitelkää notnull-rajoitetta null-tarkistuksilla ja unmanaged-tavoitetta struct- ja rajapintarajoitteilla.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”unmanaged, notnull ja new() (C# 6 -jäljitelmä)” ilmainen?

Kyllä – oppitunnin ”unmanaged, notnull ja new() (C# 6 -jäljitelmä)” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”unmanaged, notnull ja new() (C# 6 -jäljitelmä)”?

C# 6 tukee class-, struct- ja new()-rajoitteita. Jäljitelkää uudempia notnull- ja unmanaged-rajoitteita tarkistuksilla, rajapinnan rakenteella ja käytännöillä. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/3.

Kuinka kauan ”unmanaged, notnull ja new() (C# 6 -jäljitelmä)”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. unmanaged, notnull ja new() (C# 6 -jäljitelmä)
  2. Geneerinen matematiikka (yleiskatsaus) ja geneeriset annotaatiot (tarvittaessa)
  3. Uudelleenkäytettävät geneeriset apuvälineet
← Takaisin: C# Academy