Note: VS2010, and NUnit is required to use this code as is in your machine.Mouse hover on the listing, you will see options like copy to clipboard,view source.
Tests:
TestOptionalAttribute
SkipOptionalParameters
SkipOrderWithTheUseOfNamedParmeters
TestOverloadResolution
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using NUnit.Framework;
namespace LearningCSharp40
{
public class ParamArg
{
}
public class UseOfOptionalAttribute
{
public string StringValue { get; set; }
public UseOfOptionalAttribute([Optional]string param, [Optional] bool flag)
{
StringValue = param;
BooleanValue = flag;
}
public ParamArg OptionalObjects([Optional]ParamArg arg, [Optional] ParamArg arg2)
{
return arg;
}
public bool BooleanValue { get; set; }
}
public class OptionalParamWithDefaultValue
{
public string StringValue { get; set; }
public OptionalParamWithDefaultValue(string param)
: this(param, true)
{
}
public OptionalParamWithDefaultValue(string param = "N/A", bool flag = true, string name = "hi")
{
StringValue = param;
BooleanValue = flag;
Name = name;
}
public string Name { get; set; }
public bool BooleanValue { get; set; }
}
[TestFixture]
class LearnOptionalParams
{
//.NET reflector: When used with Optional attribute, compiler does substitute the default values of the types.
[Test]
public void TestOptionalAttribute()
{
UseOfOptionalAttribute useOfOptionalAttribute = new UseOfOptionalAttribute();
Assert.AreEqual(useOfOptionalAttribute.StringValue, null);
Assert.AreEqual(useOfOptionalAttribute.BooleanValue, false);
Assert.IsNull(useOfOptionalAttribute.OptionalObjects(), "expecting null");
Assert.IsNotNull(useOfOptionalAttribute.OptionalObjects(new ParamArg()), "expecting null");
}
[Test]
public void SkipOptionalParameters()
{
OptionalParamWithDefaultValue optionalParamWithDefaultValue = new OptionalParamWithDefaultValue("Hello");
Assert.AreEqual(optionalParamWithDefaultValue.StringValue, "Hello", "Expecting value passed in constructor");
Assert.AreEqual(optionalParamWithDefaultValue.BooleanValue, true, "Expecting default value of flag");
Assert.AreEqual(optionalParamWithDefaultValue.Name, "hi", "Expecting default value of Name");
}
[Test]
public void SkipOrderWithTheUseOfNamedParmeters()
{
bool result = false;
OptionalParamWithDefaultValue optionalParamWithDefaultValue = new OptionalParamWithDefaultValue(flag: result);
Assert.AreEqual(optionalParamWithDefaultValue.StringValue, "N/A");
Assert.AreEqual(optionalParamWithDefaultValue.BooleanValue, result);
}
[Test]
public void TestOverloadResolution()
{
OverloadResolution overloadResolution = new OverloadResolution();
Assert.AreEqual("NoArg", overloadResolution.Confused(), "Priority is for matching method signature: method with no arguments should be called");
Assert.AreEqual("1Arg", overloadResolution.Confused("Hello"), "Method with one argument should be called");
}
}
public class OverloadResolution
{
public string Confused()
{
return "NoArg";
}
public string Confused(string stringValue)
{
return "1Arg";
}
public string Confused(string stringValue = "N/A", bool flag = true)
{
return "2Arg";
}
}
}