关于引用类型ref的运用
一直没有弄明白ref的用法,今天用了一下msdn,发现竟然是如此的简单,用的时间要注意
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
一句话把我的迷津全部点开了
例子:
class RefExample
{
static void Method(ref int i)
{
// Rest the mouse pointer over i to verify that it is an int.
// The following statement would cause a compiler error if i
// were boxed as an object.
i = i + 44;
}
static void Main()
{
int val = 1;
Method(ref val);//这个val和上面的val是同一个
Console.WriteLine(val);
// Output: 45
}
}
在一个方法的参数定义为ref类型,在调用方法里显示的使用ref关键字。
在三层架构里面,验证数据是否完整,也会用到ref关键字。
一般会在BLL层里面验证,
如下面的代码: #region 检查数据完整性
/// <summary>
/// 检查数据完整性
/// </summary>
/// <param name="mdlObj"></param>
/// <param name="strMsg"></param>
/// <returns></returns>
protected bool ChkIntegrity(MDL.News_Type mdlObj, ref string strMsg)// 方法里面用关键字ref声明
{
if (mdlObj.NewsType_Name == "")
{
strMsg = "分类名称不能为空!";
return false;
}
if (mdlObj.NewsType_ID > 0) // 当编辑修改的情况下
{
DataTable dt = GetAllChildren(mdlObj.NewsType_LangVer, mdlObj.NewsType_ID.ToString());
for (int i = 0; i < dt.Rows.Count; i++)
{
int intNewsType_ID = Convert.ToInt32(dt.Rows[i]["NewsType_ID"]);
if (mdlObj.NewsType_ParID == intNewsType_ID)
{
strMsg = "父节点和子节点死循环!";
return false;
}
}
}
return true;
}
#endregion
同样在BLL的属于方法
在ui层运用的时间要声明ref
代码如下:
string strMsg = ""; string strNews_ID = ""; int intFlag = bllMst.Add(mdlObj, ref strNews_ID, ref strMsg);//如果不够完整,在此strMsg已经发生改变,下面就可以调用的到。。。。 if (intFlag > 0) { string strGoUrl = "NewsImg.aspx?Lang=" + strLangVer + "&News_ID=" + strNews_ID; Response.Redirect(strGoUrl); } else { MessageBox.Show(this, strMsg); }