Lister les interfaces implémentées par un Type
|
Type[] types = typeof(CC).GetInterfaces();
Type type = typeof(CC).GetInterface("II");
interface II { }
class CC : II { }
|
Tester si un Type hérite d'un autre Type
|
bool b = typeof(II).IsAssignableFrom(typeof(CC));
bool b = typeof(CC2).IsSubclassOf(typeof(CC));
interface II { }
class CC : II { }
class CC2 : CC { }
|
Tester si un objet est compatible avec un Type
|
C2 c2 = new C2();
bool b = c2 is II;
interface II { }
class C1 : II { }
class C2 : C1 { }
|
Type to / from String
|
Type CCType = typeof(CC);
string typeString = type.AssemblyQualifiedName;
Type type = Type.GetType(typeString);
|
Valeur par défaut
Si c'est un type valeur, il faut créer une instance qui sera la valeur par défaut.
Si c'est un type référence, la valeur par défaut est null.
|
Type type;
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
|
|
int i = 123;
object o = i;
object o = 123;
i = (int)o;
|
|
C1 c1 = new C2();
try
{
C3 c3 = (C3)c1;
}
catch (InvalidCastException ex)
{ }
if (c1 is C2)
{
C2 c2 = (C2)c1;
}
C2 c2 = c1 as C2;
if (c2 != null)
{ }
if (c1 is C2 c2)
{ }
class C1 { }
class C2 : C1 { }
class C3 : C2 { }
|
Types de base
Type
|
Min
|
Max
|
Size
|
.NET Framework type
|
sbyte |
-128 |
127 |
Signed 8-bit integer |
System.SByte
|
byte |
0 |
255 |
Unsigned 8-bit integer |
System.Byte
|
char |
U+0000 |
U+ffff |
Unicode 16-bit character |
System.Char
|
short |
-32768 |
32767 |
Signed 16-bit integer |
System.Int16
|
ushort |
0 |
65535 |
Unsigned 16-bit integer |
System.UInt16
|
int |
-2,147,483,648 |
2,147,483,647 |
Signed 32-bit integer |
System.Int32
|
uint |
0 |
4,294,967,295 |
Unsigned 32-bit integer |
System.UInt32
|
long |
–9,223,372,036,854,775,808 |
9,223,372,036,854,775,807 |
Signed 64-bit integer |
System.Int64
|
ulong |
0 |
18,446,744,073,709,551,615 |
Unsigned 64-bit integer |
System.UInt64
|
float Pécision 7 digits |
-3.4 × 10^38 |
+3.4 × 10^38 |
32-bit |
System.Single
|
double Pécision 15-16 digits |
±5.0 × 10^−324 |
±1.7 × 10^308 |
64-bit |
System.Double
|
decimal Pécision 28-29 significant digits |
(-7.9 x 10^28 to 7.9 x 10^28) / (10^0 to 28) |
|
128-bit |
System.Decimal
|
Dépassement / overflow
|
int i = 2147483647;
i + 1;
int[] myArray;
long totalSum = myArray.Sum(e => (long)e);
|
 |
- Les types valeur ne peuvent pas contenir la valeur null.
- Chaque type valeur possède une valeur par défaut.
- Stockés dans la stack (sauf boxed, champs d'une classe, lambda expression)
- plus rapide, moins couteux en place et pas de gestion par le GC.
|
- Structures
- Énumérations
- Types numériques
 |
Stockés dans la heap |
string est un type référence mais se comporte comme un type valeur pour les comparaisons.
|
string a = "hello";
string b = String.Copy(a);
string c = "hello";
if (a == b)
if (a.Equals(b)) // true
// Pour comparer les références des string
if ((object)a == (object)b) // false
if (Object.ReferenceEquals(a, b)) // false
// Attention si 2 string ont la même valeur (a et c), ils pointeront vers la même référence
if ((object)a == (object)b) // true
if (Object.ReferenceEquals(a, b)) // true
|
Passage de types valeur par valeur
|
var i = 1;
SetTo5(i);
void SetTo5(int j)
{
j = 5;
}
|
Passage de types valeur par référence
|
var i = 1;
SetTo5(ref i);
void SetTo5(ref int j)
{
j = 5;
}
|
Passage de types référence par valeur
|
class MaClasse
{
public int MyProperty { get; set; }
}
var c = new MaClasse() { MyProperty = 1 };
SetMyPropertyTo5(c);
void SetMyPropertyTo5(MaClasse m)
{
m.MyProperty = 5;
m = new MaClasse() { MyProperty = 55 };
}
|
Passage de types référence par référence
|
var c = new MaClasse() { MyProperty = 1 };
SetMyPropertyTo5(ref c);
void SetMyPropertyTo5(ref MaClasse m)
{
m.MyProperty = 5;
m = new MaClasse() { MyProperty = 55 };
}
|