关于C#的一些知识(一)

      前几个月图一时爽快辞了职,自认为做了2年.net开发,对C#可算是轻车熟路,然而出去面试却坑的要死~被别人问的一脸懵逼。突然意识到自己这俩年就是一个代码搬运工,只知道日复一日的写代码,却从来没问过为什么这样写?为什么这样写就能实现这样的问题。之后准备开一个系列,总结下平时遇到的一些C#知识,算作记录吧,希望坚持下去!

今天写写我遇到的第一个问题吧:C#的中方法参数的传递方式。

简单里讲,其实有俩种,一种是值传递,一种是引用传递

        public void Demo(int a, DateTime date)
        {
            Console.WriteLine("值传递");
        }
       
        public void Demo(ref string a,out string b,StudentInfo obj)
        {
            b = "Hello World";
            Console.WriteLine("引用传递");
        }

先说下我值和引用,看了下网上大佬的研究,值类型都是来自于System.ValueType派生类,而System.ValueType又是直接继承自System.Object,枚举类型来自System.Enum,System.Enum又是来派生于System.ValueType。而且值类型都是隐式密封的(sealed)。值类型包括了系统定义的类型,用户自定义的和枚举。这里说下,DateTime是个结构体,不是类,所以它是值类型。

值类型也叫轻量级类型,大多数情况下,都是分配在线程栈上面的,不受GC影响。引用类型,基本上类,接口,都是引用,引用类型分配在托管堆上面,会产生GC。

至于传递方式,值类型是对值的拷贝,等于再拷贝一份到线程堆上面,而引用类型只是传递一个地址。

我们判断一个类型是值类型还是引用类型,可以根据传递来看出,比如传递datetime类型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime date1 = DateTime.Now;
            DateTime date2 = date1;

            Console.WriteLine(date1);
            Console.WriteLine(date2);

            date1 = date1.AddHours(12);

            Console.WriteLine(date1);
            Console.WriteLine(date2);

            Console.ReadLine();

        }
    }
}

运行后结果:

这里看出,我改变了date1的值后,date2并未改变。这就是值类型。

先写到这里吧~这个系列随缘写~还能说很多,堆和栈,GC,ref和out等等。

留个记录吧。后面会写写.net MVC。之前公司一直用webfrom,换了工作换了MVC模式。也算一个新的开始吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值