是不是被黑了,泛型的多种应用

本篇文章主要介绍泛型的应用。

首先大家要知道在浏览器上浏览虚拟主机,必须使用Hosts文件或域名系统(DNS)实现主机名到IP地址的解析。在局域网中用Hosts文件或DNS都可以,在Internet上只能用DNS了。 

c#中的对象大体分为值类型和引用类型,值类型大致包括 int, string, struct等,引用类型大致包括 自定义Class,object 等。

泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性、类型安全性和效率。

1.当用户输入一个域名以百度为例(www.baidu.com)。

值类型直接存储对象,而引用类型存储对象的地址,在对引用类型进行复制的时候,也只是复制对象的地址。

泛型的定义

2.首先会到C:WindowsSystem32driversetc目录中用Hosts文件去查询相关的IP是否存在,如果存在就会访问该IP地址。

完全复制一个引用类型对象主要有几种方法:

1.额外添加一个构造函数,入参为待复制对象(如果字段为引用类型,需要继续添加构造函数,这样情况会变的十分复杂。)

    public class Test1
    {
        private int field1;
        private int field2;
        private int field3;
        public Test1()
        { 

        }

        public Test1(Test1 test1)
        {
            this.field1 = test1.field1;
            this.field2 = test1.field2;
            this.field3 = test1.field3;
        }
    }

2.利用序列化反序列化(对性能会有杀伤)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.WriteLine(t1.list.Count);
            Test t2 = (Test)Clone(t1);
            t2.list.Add("");
            Console.WriteLine(t2.list.Count);
            Console.WriteLine(t1.list.Count);
            Console.ReadLine();
        }

        public static object Clone(object obj)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            ms.Position = 0;
            return (bf.Deserialize(ms)); ;
        }
    }

    [Serializable]
    public class Test
    {
        public List<string> list = new List<string>();
    }
}

3.利用反射(测试了一个网上的接口可用,但是对性能杀伤和序列化反序列化相当,而且对代码混淆有一定影响。   

下面定义了一个普通类和一个泛型类,我们可以明确看到泛型类和普通类最大的区别就是多了一个<T>。

3.不存在该域名解析,那么就会到公网DNS查找。

所以,这个<T>就标记了,这个类是泛型类。其中这个T,也可以写成A,B,C,D或其他字符。

当你访问域名出现异常,可能Hosts文件被修改了或者DNS被挟持了。

public class Generic
{
    public String Name;
}

public class Generic<T>
{
    public T Name;
}

解决方案:

泛型,顾名思义,就是泛指的类型。好比男人,女人,白人,黑人,可以泛称为【人】。

1.首先检查你的C:WindowsSystem32driversetc目录下的Hosts文件查看是否存在域名强制转向IP的情况,有的话把这个选项去掉。找不到文件设置隐藏文件可见。

但类型只能是一个类型。 那么泛型和类型之间是什么关系呢?

图片 1

其实很简单,泛型在定义的时候,是泛指类型;在使用的时候,就需要被指定,到底使用哪个类型。

2.DNS被劫持或篡改了。你可以手动修改本地电脑的DNS,默认为空如下图,你可以在首选设置为:114.114.114.114,备用设置为:114.114.115.115;并查杀一下病毒。或者你的路由器被篡改了(设置的密码太弱),建议用修复工具修改。

即,使用时,就不在是泛指类型,而是特定类型。

图片 2

好比,定义时,定义了一个人。但在使用时,必须明确指定,到底是黑人还是白人。

上面介绍了网络正常域名访问出问题的原因,那么下面就带大家使用C#搞一个Hosts修改工具(大家可以来研究,了解技术,但是不要用来恶搞他人):

泛型的使用

private static void updateHosts(string ip,string domain)
        {
            string path = @"C:WINDOWSsystem32driversetchosts";
            //通常情况下这个文件是只读的,所以写入之前要取消只读
            File.SetAttributes(path, File.GetAttributes(path) & (~FileAttributes.ReadOnly));//取消只读
            //1.创建文件流
            FileStream fs =ip==""? new FileStream(path, FileMode.Create): new FileStream(path, FileMode.Append);
            //2.创建写入器
            StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
            //3.开始写入
            bool result = false;//标识是否写入成功
            try
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(ip);//IP地址
                sb.Append("   ");
                sb.Append(domain);//网址
                sw.WriteLine(sb.ToString());
                result = true;
            }
            catch (Exception ex)
            {
                result = false;
            }
            finally
            {
                //4.关闭写入器
                if (sw != null)
                {
                    sw.Close();
                }
                //5.关闭文件流
                if (fs != null)
                {
                    fs.Close();
                }
            }
            if (result == true)
            {
                MessageBox.Show("成功!");
                File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.ReadOnly);//设置只读
            }
            else
            {
                MessageBox.Show("失败!");
                return;
            }
        }

泛型类跟普通类的使用方式一样,都需要实例化对象,再由对象来调用内部的属性或方法。

图片 3

下面代码实例化了泛型Generic,实例化时,还指定了该泛型Generic的指定类型为String。

在网址部分输入www.baidu.com,之后添加试试看,你还能访问百度吗?

所以要给泛型Generic的属性Name赋值,就需要赋值字符串类型的值。

没关系,之后你点清除,你又可以访问了!

public static void Excute()
{
    Generic<String> gs = new Generic<String>();
    gs.Name = "Kiba518";
}

源码地址:

下面代码定义了一个Int类型的泛型Generic。

 

public static void Excute()
{
    Generic<int> gs = new Generic<int>();
    gs.Name = 518;
}

泛型的默认值

泛型的默认值,如下面代码所示。需要使用default(T)来赋值。

本文由澳门新葡亰平台官网发布于编程,转载请注明出处:是不是被黑了,泛型的多种应用

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。