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ä.
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
Kertaus
Kertaus: Käyttäkää C# 6:ssa rajoitteita class/struct/new(). Jäljitelkää notnull-rajoitetta null-tarkistuksilla ja unmanaged-tavoitetta struct- ja rajapintarajoitteilla.
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
- unmanaged, notnull ja new() (C# 6 -jäljitelmä)
- Geneerinen matematiikka (yleiskatsaus) ja geneeriset annotaatiot (tarvittaessa)
- Uudelleenkäytettävät geneeriset apuvälineet