Thursday, February 02, 2006

A good way to create a custom Value-Type object in C#?

Have you ever written code like this?

State state = new State("AZ");
Money money = new Money(299.95);
 
State state = State.Parse("AZ");
Money money = Money.Parse(299.95);

How many domain-specific Value Type classes (you care about equality but not identities) have you been creating every project? The question of should I use the "new" keyword or a static .Parse() method to create them is always a coding consistency problem.

What if I tell you that you can do this in C#:

State state = "AZ";
Money money = 299.95;

Simple and clean. Here's how:

public class State
{
    private readonly string _state;
 
    private State(string state)
    {
        _state = state;
    }
 
    public static implicit operator State(string state)
    {
        return new State(state);
    }
}

8 comments:

Bil Simser said...

Great post! This is a much more readable way for me to create value objects, and provides that code consistency that is always good.

Anonymous said...

Hi, nice post, although when i checked my source for value-types where i could implement this feature, i couldn't find many places, as most of my value-types have more than one property: my Money has Value and Currency for example.
Of course you could make one currency the "default", but i think that would not do any good to the clarity of the code. But still, thanks for posting this trick, i'm sure it'll come in handy one day.

Anonymous said...

How can i retrieve the value even if have only one property.

The member varibale should be accesses using fully qualified name right.

Like state.state.

Stephen Chu said...

Sure. I can think of a value object like Address may have something like:
+ Address1
+ Address2
+ State
+ City
+ ZipCode

Because of the fact that they are value objects, you should also override their Equals() and GetHashCode(), cos we care about their equalities and not identities.

However, you truly have to think about why you need to look at the value of your State object. There is a big difference between doing:
if (aState.Value == texasState.Value)
versus
if (aState.IsSouthernState)
The difference being encapsulation, making your objects truly smart objects who knows the most about their states. Otherwise, a simple ToString() will do just fine.

Anonymous said...
This comment has been removed by a blog administrator.
mohamed ali said...

شركة عزل خزانات بخميس مشيط
شركة كشف تسربات المياه بخميس مشيط
شركة تسليك مجارى بخميس مشيط
شركة مكافحة حشرات بخميس مشيط
شركة نقل اثاث بخميس مشيط

mohamed ali said...

شركة كشف تسربات المياه بسيهات وعنك
شركة تسليك مجارى بسيهات وعنك
شركة مكافحة النمل الابيض بسيهات
شركة مكافحة حشرات بسيهات وعنك
شركة تنظيف موكيت ومجالس بسيهات
شركة تنظيف خزانات بسيهات وعنك

mohamed ali said...


من أكثر الأمور التي يجب علينا أن نقوم بالاهتمام بها هي مكافحه الحشرات لان الحشرات المنزلية عندما تتواجد داخل المنزل فأنها تؤدى إلى عواقب وخيمة جدا في هذا المنزل الصفرات لمكافحة الحشرات بالرياض ومن أهم هذه العواقب هي الأمراض الكثيرة التي تأتي إلينا بسبب هذه الحشرات المزعجة لان الحشرات تكون ملوثه وتخرج من البالوعات وتخرج أيضا من المجاري وفي هذه الحالة تكون الحشرات تشكل خطر كبير جدا الصفرات لرش المبيدات بالرياض على جميع أفراد الأسرة وعلى جميع الأفراد المتواجدين داخل المنزل وخاصة للأطفال الصغار ولذلك يجب علينا أن نقوم بالاهتمام بهذا الأمر وان نقوم برش المبيدات الحشرية داخل المنزل بطريقه سليمة وأمنه الصفرات لرش المبيدات وان نقوم بعلاج هذه المشكلة طوال الوقت حتى نقوم بالقضاء على أي حشرات تتواجد داخل منزلنا و حتى نجعل البيت نظيف تماما من أي حشرات .

تعتبر شركتنا افضل كشف تسربات المياه بجده داخل المملكه حيث ان شركتنا لديها قدره كبيره جدا علي معرفه اماكن التسربات وتضع لكم الحل الامثل للقضاء الصفرات للعزل علي هذه المشكله فنحن نقدم لكم خدمه فريده من نوعها والقضاء علي مشاكل التسربات تماما فنحن نعمل وفق منظومه عمل متكامله الصفرات لكشف لتسربات المياه وراقيه جدا ونقدم لكم افضل اسليب الكشف وارقاها علي الاطلاق ونوفر اسلوب فني عالي جدا ونجتهد لنخرج لكم عمل يليق بكم ويليق باسم شركتنا الكبير جدا لان شركتنا هي اكبر.

العميل نبداء مباشرة وانة يتم هذا عقب تحديد المشكلة الأساسية ويكون من خلال اجهزة تسليك البالوعات المتطورة هو الحل حيث ان إستعمال الاسيد لفتح المجارى ليس يُعد الحل الامثل و الاسرع فى وسيلة تسليك البلاعة و فتح المجاري المقفلة الصفرات لتسليك المجاري ويكون بلا تكسير وإذ لم يكن لك التمكن في تسليك المجارى واذا كنت لا تعرف العلة فى انسداد المرحاض.
هي إزالة الأوساخ والقاذورات والنفايات من أي مكان والنظافة عبارة عن ممارسات يومية أو أسبوعية أو شهرية ويجب التنظيف بشكل دوري لأن نظافة المكان تؤدي خدمة المنزل بالرس إلى أفض صحة بالنسبة للأفراد ويؤدي إلى منع انتشار الأمراض والأوبئة بالمكان، وأن نظافة تؤدي إلى راحة نفسية شركة تنظيف بالرس والشعور بالسعادة
أن النظافة أساس كل تقدم ورقي، عنوان الحضارة شركة تنظيف خزانات بالمدينة المنورة ، ومظهر من مظاهر الإيمان .