Betul ke korang ni...
Dari MSDN <msdn.microsoft.com/en-us/library/sbbt4032(VS.80).aspx>
"Every enumeration type has an underlying type, which can be any
integral type except char"
Aku try run code ron ni, dapat compile error:
"Type byte, sbyte, short, ushort, int, uint, long, or ulong expected"
Hoho.. tak pakai enum? Living live dangerously free and wild :D
Actually, ni yg aku selalu buat:
class Student
{
///<summary>Value must be from Student.Statuses</summary>
public string Status { get; set; }
public class Statuses
{
public const string Active = "A";
public const string Suspended = "S";
public const string Dismissed = "D";
}
}
var s = new Student();
s.Status = Student.Statuses.Active;
Melalui cara ni, kita boleh dapat intellisense support utk values yg
*mungkin* bagi Status.
Tapi tak boleh enforce compile time check kalau dia bagi string lain. E.g:
Tak produce error bila s.Status = "X";
Dan tak comply pun dgn dua-dua kekangan tadi.
Memang pernah nampak solution mcm ni sebelum ni.. Tapi tak comply
kekangan yg kedua:
2) Value yang disimpan *mesti* nilai yang sebenar yang tersebut (A, S,
atau D).
Sebabnya, kadang2 penting utk simpan value yg *bermakna* dalam
database. Dlm contoh ni, sekali imbas dah tau Student tu (A)active,
(S)suspended, atau (D)ismissed. Kalau kita simpan enum, atau
underlying typenya yg biasanya int, kita kena tahu 0 adalah active, 1
adalah suspended, 2 adalah dismissed. Leceh beb.
Baru terfikir, boleh ke buat something yg mcm ni, guna Attribute maybe?
[AllowedValues("A", "S", D")]
string Status { get; set; }
Macam design by contract?