C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言

-孤独的路上有梦想作伴,乘风破浪-
二.页面值传递
(1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转、计算等操作)。为了实现多种方式的数据传递,C#提供一下几种方式:
1.Query.String方式
2.Server.Transfer方式
3.Cookie方式
4.Session方式
5.Application方式
(2)实现方式
新建TestTransfer项目,添加TransferOne.aspx页面和TransferTwo.aspx页面。在TransferOne.aspx中,添加两个文本框和一个按钮,用来实现跳转。在btnLogin_Click中添加实现的逻辑代码:


在TransferTwo.aspx中添加:

在Page_Load中添加逻辑实现代码,

以上就是c#页面之间传值的几种方式,其中Query.String方式在URl地址栏中会显示传递的的参数值信息。
注意:Session与Cookie的区别
由于Http协议是基于Tcp/Ip的,当用户从客户端发送请求到服务端,服务端响应请求,并返回数据给客户端,这个过程是无状态的,为了保存客户端的某些状态,因此用到了Session和Cookie机制。
(1)session存储在服务端,cookie是存储在客户端,并且存储的大小有限制。
(2)session实现的本质是依靠cookie来做的,一般把具有敏感信息的内容用session存储在服务端,例如密码等。首先在服务端生成session以后,返回SessionID给客户端,客户端Cookie保存SessionID的值,
下次请求的时候带着SessionID去获取对应的Session的值。
(3)Cookie存在有效期,可以设置cookie的有效期。
声明Cookie的方式:
var cookie = Request.Cookies["user"] ?? new HttpCookie("user");
cookie.Values.Set("username", this.TextBox1.Text);
cookie.Values.Set("password", this.TextBox2.Text);
Response.SetCookie(cookie);
Response.Cookies.Add(cookie);
声明Session方式:
Session["username"] = this.TextBox1.Text;
Session["password"] = this.TextBox2.Text;
三、重载与重写、隐藏
(1)定义:
重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。返回类型可以相同也可以不同。
重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的。例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
隐藏:基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。子类覆盖基类的方法,其返回值类型必须相同。
(2)实现Demo
static void Main(string[] args)
{
var coderOne=new DoWork();
coderOne.DoCoding("liupeng");
coderOne.DoCoding("liupeng", 24);
var coderTwo=new SubDoWork();
coderTwo.Say();
//隐藏基类的方法
coderTwo.EnjoyLife();
//通过实例化的对象,决定调用基类还是子类中的方法
coderOne.EnjoyLife();
Console.ReadKey();
}
public class DoWork
{
public virtual void Say()
{
Console.WriteLine("I am in Base Calss,Hello Everyone!");
}
public void EnjoyLife()
{
Console.WriteLine("I am a Coder, but I like my life, Coding is my life,also is my girl! Haha!");
}
public void DoCoding(string name)
{
Console.WriteLine(string.Format("My name is {0},I love coding!", name));
}
public void DoCoding(string name, int age)
{
Console.WriteLine(string.Format("My name is {0},age is {1},I always love coding!", name, age));
}
}
public class SubDoWork : DoWork
{
public override void Say()
{
Console.WriteLine("I am in SubClass,Hello Everybody!");
}
new public void EnjoyLife()
{
Console.WriteLine("I am a new bird ,i must work hard to achieve my dream!");
}
}
四、类与结构体
1.关于类和结构体的区别:
(1)类中传递的内容是存储在托管堆中,而结构体中传递的内容是存储在栈中。
(2)类中传递的对象修改的时候,将修改源对象;而结构体中的对象修改时,源对象不会改变,保持原来的状态。
(3)类中的构造函数,可以是默认无参的构造函数,也可以是有参数的构造函数;但结构中的构造函数必须为有参数的构造函数,不能为默认的构造函数。
2.实现Demo
static void Main(string[] args)
{
Console.WriteLine("-----------初始化之前的字段的值--------------");
var studentOne = new StuName("zhangyonghe", 26);
var studentTwo = new StructStuName("liupeng", 25);
studentOne.SayHello();
studentTwo.SayHello();
Console.WriteLine("--------------修改对象的传递时的值------------");
var studentOneNew = studentOne;
studentOne.Age = 30;
studentOne.SayHello();
var studentTwoNew = studentTwo;
studentTwoNew.Age = 35;
studentTwo.SayHello();
Console.ReadKey();
}
public class StuName
{
public string Name { get; set; }
public int Age { get; set; }
public StuName(string name, int age)
{
this.Name = name;
this.Age = age;
}
public void SayHello()
{
Console.WriteLine(string.Format("Class类结构的姓名为:{0},年龄为:{1}", Name, Age));
}
}
public struct StructStuName
{
public string Name;
public int Age;
//结构体的构造函数必须滴啊有参数
public StructStuName(string name, int age)
{
Name = name;
Age = age;
}
public void SayHello()
{
Console.WriteLine(string.Format("Struct结构的姓名是:{0},年龄是:{1}", Name, Age));
}
}
运行结果为:

五.装箱与拆箱
(1)定义:将值类型转化为引用类型为装箱;将引用类型转化为值类型称之为拆箱。
(2)熟悉一段代码:
public void Method1(){
// Line 1
int i=4;
// Line 2
int y=2;
//Line 3
class1 cls1 = new class1();
}
此时,程序是这样解析的:

(1)先在栈上根据值类型的大小分配相应的内存空间,将值类型变量的Value存在栈空间上。
(2)当执行到实例化一个对象cls1时,编译器在站上创建了一个指针,真实的对象存储在另一种叫“堆”的内存中。
"堆"并不跟踪运行内存,它更像一堆随时可以访问的对象。堆用于动态分配内存。这里需要着重说明的是引用指针是分配在栈上。
声明Class1 cls1时并不会给Class1的实例分配内存,而是分配一个栈变量cls1(并设置为null),然后把它指向“堆”。

当我们在初始化一个对象,并将cls1赋给cls2的时候,其实是在stack上面创建一个栈变量,并把变量的指针指向cls1对象的引用。
然后我们看看拆箱的过程发生了什么?
int i=4;
object o=i;
int j=(int)o;

拆箱的过程:
(1). 检查实例:首先检查变量的值是否为null,如果是则抛出NullReferenceException异常;再检查变量的引用指向的对象是不是给定值类型的已装箱对象,如果不是,则抛出InvalidCastException异常。
(2). 返回地址:返回已装箱实例中属于原值类型字段的地址,而两个额外成员(类型对象指针和同步块索引)则不会返回。
到此,拆箱过程已经结束,但是伴随着拆箱,“往往”(《CLR via C#》中的描述,用的是”往往“,而并没有说一定)会紧接着发生一次字段的复制操作。
实际上就是讲已装箱对象中的实例字段拷贝到内存栈上。
一个自己维护的微信公众号,目前文章不多,希望接下来的日子,会一直更新下去,写自己的生活,分享技术,希望热爱生活的技术宅,一起交流!

C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱的更多相关文章
- Java基础知识强化66:基本类型包装类之JDK5新特性自动装箱和拆箱
1. JDK1.5以后,简化了定义方式. (1)Integer x = new Integer(4):可以直接写成如下: Integer x = 4 ://自动装箱,通过valu ...
- 【.Net基础二】浅谈引用类型、值类型和装箱、拆箱
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引 ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...
- 站在OC的基础上快速理解Swift的类与结构体
阅读此文章前,您已经有一定的Object-C语法基础了!) 2014年,Apple推出了Swift,最近开始应用到实际的项目中. 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡 ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
前言 这一节主要来了解一下类和结构体之间的异同点.以及针对String和StringBuilder的用法.equals和==,其实可以看出很多地方都用到了上一节的值类型和引用类型.堆栈和装箱拆箱操作吧 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
随机推荐
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- My TWI
前言 对TWI没有什么特别的印象,因为有一个更出名的TWU,而我去年又刚好错过了它,因此TWU的光辉完全掩盖了TWI.对TWI印象最深的是在邮件中看到的38th北京的这期,看到他们的图文记录,在圈子中 ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- Discuz NT 架构剖析之Config机制
接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- AEAI DP V3.7.0 发布,开源综合应用开发平台
1 升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...
- HotApp小程序服务范围资质查询器
微信小程序提交审核需要选择资质服务范围,如果服务范围不对,审核会不通过, 开发小程序之前,最好先查询所开发小程序的资质范围,否则无法通过微信审核. 小程序的资质范围查询地址,数据同步微信官方 ht ...
- Form 表单提交参数
今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...
- 【python之路5】学习小结
一.编程语言 java C语言 C++ C# Python 二.python语言的种类 Cpython:python的官方版本,使用最为广泛,实现将python(py文件)转换为字节码文件(pyc文件 ...
- video.js--很赞的H5视频播放库
video.js是一款很流行的html5视频播放插件.很适合在移动端播放视频(比如微信网页),功能强大,且支持降级到flash,兼容ie8.官网:http://videojs.com/ git& ...