有趣的应用

【品名】妻子
【俗称】媳妇儿
【通用名】老婆
【英文名】wife
【化学名称】已婚女性
【成分】水、蛋白质、脂肪、核糖核酸、碳水化合物以及少量矿物质,气味幽香。
【理化性质】酸性;可分为一价(嫁)、二价(嫁)、三价(嫁)……n价(嫁)。易溶于密语、甜言;遇钻石、名车、豪宅熔点降低,难溶于白丁。
【性状】本品为可乐状凹凸异性片,表面光洁,涂有各种化妆品、对钻石、铂金有强烈的亲和力;害羞时泛红,生气时泛绿,随时间推移表面会出现黄斑,起皱,但不影响继续使用。
【功能主治】主治单身恐惧症,对失恋者和相思病有明显效果,亦可用于烧淘洗买、带孩子。
【副作用】气管炎、耳根软、视疲劳、行为受阻等。严重不良反应者,可致皮肉损伤。
【用法用量】一生一片。
【禁忌症】公开服用两片或两片以上
【注意事项】
1、肾功能不全者慎用
2、请控制每日用量,如身体出现不适应症状应适当控制频次;
3、服用本品时如同时服用其他药品请咨询生产企业,否则后果自负;
【规格】几十千克志几百千克,片重超标不影响使用,一般以45kg为最佳。
【贮藏】常温下保存。避免与成年女性、单独帅哥相处。严禁在外过夜,应放到男人不易接触到的位置保存。
【包装】各种时装、鞋帽、首饰、手袋,随季节变化更换。
【有效期】终生有效。
【批准文号】见钻石购买发票号码
【生产日期】同身份证出生年月日
【生产企业】岳父岳母(仅针对于岳父岳母作风正派)。
本产品质量三包,如出现质量问题请与当地民政局联系。

 

这是网上非常热的一个博文,看完以后,我拍案惊起,这TMD才是真正的面向对象的思想嘛......

这,才是真正地“搞对象”嘛......

人家敢于面对、勇于面对、以娱乐的精神面对惨淡的对象嘛......

人家知道,搞对象,最重要的,是把对象干什么用的先搞清楚嘛......

人家知道,先把对象玩烂了,就没有搞不好的对象嘛......

我绝对想象不出来,不远的将来,这个对象,不能给他创造个人“类”出来....

 

我想,作者这家伙,不学编程,那是相当的可惜了…

 

前面注册的代码,很多网友看后都生气了,后果很严重,都急吼吼地要来Sql注入了。

很多小盆友,包括本大人,N小时前,也不知道还有注入一说。感谢网友们的不吝赐教,本大人现学现卖,科普一下吧,讲最简单的,你在用户名文本框中输入1' or '1'='1 ,密码随意,所谓的登录系统,就形同虚设……

 

解决这个问题的方法有很多,其中,一个重要的方法,就是参数化查询。

 

参数化查询就是在访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter类) 来给值。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。

Parameter这么厉害?想不想讨来做老婆?帮你看看家门,河东狮吼,吓退十万注入客??

还是让我们先附庸风雅,写一个SqlParameter使用说明书吧:

【家住何方(程序集名称)】system.data.dll

【姓甚(命名空间)】System.Data.SqlClient
【名谁(名称)】SqlParameter
【祖父母】System.Object
【父母】System.MarshalByRefObject

【主要功能】可单独或做成数组,存放、传递SqlCommand的参数或参数组,当然是防止骇客Sql注入
【主要缺点】不能生育,无法继承此类
【备注】参数名称不区分大小写

【生产日期】new的那一刻
【有效期】招之即来,挥之即去,用完自动消失
【使用方法】参考下面示例程序

 

 

?protected void btnRegist_Click(object sender, EventArgs e)
{
    string strConnection = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;
    string cmdText = "INSERT INTO Users(Username,Password,Name,Sex,Age,Phone,Email,QQ) values(@Username,@Password,@Name,@Sex,@Age,@Phone,@Email,@QQ)";
 
    string username = txtUserName.Text;
    string password = txtPassword.Text;
    string name = txtName.Text;
    string sex = radlSex.SelectedValue;
    int age = int.Parse(txtAge.Text);
    string phone = txtPhone.Text;
    string email = txtEmail.Text;
    string qq = txtQQ.Text;
 
    SqlParameter[] parms ={
        new SqlParameter("@UserName", SqlDbType.VarChar, 20),
        new SqlParameter("@Password", SqlDbType.VarChar, 20),
        new SqlParameter("@Name", SqlDbType.VarChar, 20),
        new SqlParameter("@Sex", SqlDbType.VarChar, 2),
        new SqlParameter("@Age", SqlDbType.Int),
        new SqlParameter("@Phone", SqlDbType.VarChar, 20),
        new SqlParameter("@Email", SqlDbType.VarChar, 50),
        new SqlParameter("@QQ", SqlDbType.VarChar, 20)};
 
    parms[0].Value = username;
    parms[1].Value = password;
    parms[2].Value = name;
    parms[3].Value = sex;
    parms[4].Value = age;
    parms[5].Value = phone;
    parms[6].Value = email;
    parms[7].Value = qq;
 
 
    SqlCommand cmd = new SqlCommand();
    SqlConnection conn = new SqlConnection(strConnection);
    try
    {
        if (conn.State != ConnectionState.Open)
            conn.Open();
 
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = cmdText;
 
        foreach (SqlParameter parm in parms)
            cmd.Parameters.Add(parm);
 
        cmd.ExecuteNonQuery();
    }
    catch
    {
        Response.Redirect("ErrorMessage.aspx");
    }
    finally
    {
        conn.Close();
    }
 
    Response.Redirect("Login.aspx");
}

c#主要支持下面所示的运算符:


算术运算符                         + - * / %
逻辑运算符                         & | ^ ~ && || !
字符串连接运算符                   +
增量和减量运算符                   ++ --
移位运算符                         << >>
比较运算符                         == != < > <= >=
赋值运算符                         = += -= *= /= %= |= ^= <<= >>=
成员访问运算符(用于对象和结构)   .
索引运算符(用于数组和索引器)     []
数据类型转换运算符                 ()
条件运算符(三元运算符)           ?:
委托连接和删除运算符               + -
对象创建运算符                     new
类型信息运算符                     sizeof(只用于不安全的代码)  is as typeof
溢出异常控制运算符                 checked unchecked
间接寻址运算符                     * -> &(只用于不安全的代码) []
命名空间别名限定符                 ::
空接合运算符                       ??

比较不常用却又很重要的运算符:
1、is运算符和as运算符
is运算符可以检查对象是否与特定的类型兼容。比如下例中要检查变量是否与object类型兼容:

int i=0;
if(i is object)
{
  Console.WriteLine("i is an object.");
}
as运算符用于执行引用类型的显式类型转换。如果要转换的类型和指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。举例如下:

object obj1="a string";
object obj2=5;
string str1= obj1 as string;// str1="a string";
string str2= obj2 as string;//str2=null;

注:as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。
2、checked和unchecked运算符
有如下的代码:

byte b=255;
b++;
Console.WriteLine(b.ToString());
byte数据类型只能包含0~255的数,所以b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。如果把一块代码段标志为checked,CLR就会执行溢出检查,如果发生异常,就抛出异常。

byte b=255;
checked
{
  b++; //抛出OverflowException
}
Console.WriteLine(b.ToString());
如果要禁止溢出检查,可以把代码标记为unchecked:

byte b=255;
unchecked
{
  b++;
}
Console.WriteLine(b.ToString());
在上述代码中,不会抛出异常,但会丢失数据,因为byte数据类型不能包含256位,溢出的位会丢失,b变量得到的值是0.
注:unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。
3、sizeof运算符
学过c的都知道,sizeof可以用来确定堆栈中值类型需要的长度(单位是字节):

unsafe
{
  Console.WriteLine(sizeof(int));//结果为4,因为int有四个字节,32位 
}
4、可空类型和运算符
如果在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用时的影响。通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null。

int?a = null;
int?b = a+4; //b=null;
int?c = a*2; //c=null;
注意,在比较可空类型时,只有有一个操作数是null,比较的结果就是false。即不能认为因为一个条件是false,那么它的对立面就是true。

int?a=null;
int?b=10;
if(a>=b) //空值a显然不能和b比较
  Console.WriteLine("a>=b");
else
  Console.WriteLine("a<b");

5、空接合运算符(??)
空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型不同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:

int?a=null;
int b;
b=a??10; // b的值为10;
a=15;
b=a??10;//  b的值为15;

注意:如果第二个操作数不能隐含地转换为第一个操作数的类型,就生成一个编译错误。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值