首页 / Unity3d / C#

读一读

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, string> dict = new Dictionary<string, string>();
        dict.Add("one", "hello");
        dict.Add("two", "world");
        dict.Add("three", "gogo");

        //判断字典的key是否存在
        if (dict.ContainsKey("two"))
        {
            //根据键值取值
            Console.WriteLine(dict["two"]);
        }

        //输出字典的长度
        Console.WriteLine(dict.Count);

        //遍历字典
        foreach (var i in dict)
        {
            Console.WriteLine(i.Key + ":" + i.Value);
        }

        Console.ReadKey();
    }
}

对于泛型类,如A<T>,T为泛型,随着T的不同,这个类就是一个不同的类,也就是说A<int>和A<string>是两个不同的类型,所以他们的静态属性和方法是各自拥有和不是唯一的。

class Singleton<T> where T:new()
{
    private static T _instance = default(T);

    public static T GetInstance()
    {
        if (_instance == null)
        {
            _instance = new T();
        }

        return _instance;
    }

}
class NetManager
{
    public string Name = "Hello";
}
class GameManager
{
    public int t = 100;
}
class Program
{
    static void Main(string[] args)
    {
        GameManager g = Singleton<GameManager>.GetInstance();
        NetManager n = Singleton<NetManager>.GetInstance();
        Console.WriteLine(n.Name + g.t);
        Console.ReadKey();
    }
}

这样子,利用这个就是“一个泛型类的静态属性和方法不同的类型T是不同类型”,就可以把想控制为单例的类都通过这个访问,减少了很多重复的单例类的编写,像往常那样编写就可以了。坏处就是,这个单例类可能会没有经过这个步奏,从而会产生多个实例。


using System;
using System.Xml.Serialization;
using System.IO;

namespace Xml
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlStr = "假装是一个序列化对象数据xml数据";

            using (StringReader sr = new StringReader(xmlStr)) {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
                MyClass myClass = (MyClass)xmlSerializer.Deserialize(sr);

                Console.WriteLine(myClass.Str + " " + myClass.Num);
            }

               
            Console.ReadKey();
        }
    }
}

序列化和反序列化都是用流来读取和保存的,所以序列化时用StringWrite,反序列化时用StringReader。注意对象类的数据对应。


声明一个承载数据的类为public

public class MyClass
{
    public int Num;
    public string Str;
}

处理成xml格式的字符串

using System;
using System.Xml.Serialization;
using System.IO;

namespace Xml
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass my = new MyClass();
            my.Num = 10;
            my.Str = "Chicai";

            XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
            StringWriter stringWriter = new StringWriter();
            serializer.Serialize(stringWriter, my);
            string xmlStr = stringWriter.ToString();
            stringWriter.Close();

            Console.WriteLine(xmlStr);
            Console.ReadKey();
        }
    }
}



using System;
using NHibernate.Cfg;
using Shit.Model;
using NHibernate;
using NHibernate.Criterion;

namespace Shit
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration config = new Configuration();
            config.Configure();
            config.AddAssembly("Shit");

            ISessionFactory sessionFactory = config.BuildSessionFactory();

            ISession session = sessionFactory.OpenSession();

            Config c;
            c = session.Get<Config>(2);
            session.Delete(c);//删除
            c = session.Get<Config>(3);
            c.Name = "Hello World";
            session.Update(c);//更新
            session.Flush();//将内存的字节流写入文件

            session.Close();
            Console.ReadKey();
        }
    }
}

这里不调用Flush的话删除数据是没有效果的,按常理说Close()之后就会写入的,但是没有,所以还是Flush()一下


using System;
using NHibernate.Cfg;
using Shit.Model;
using NHibernate;
using NHibernate.Criterion;

namespace Shit
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration config = new Configuration();
            config.Configure();
            config.AddAssembly("Shit");

            ISessionFactory sessionFactory = config.BuildSessionFactory();

            ISession session = sessionFactory.OpenSession();
            //可以多个Add添加多个条件
            Config c = session.CreateCriteria(typeof(Config))
                .Add(Restrictions.Eq("Name", "xxx"))
                .UniqueResult<Config>();

            Console.WriteLine(c.Name + c.UserID);

            session.Close();

            Console.ReadKey();
        }
    }
}

UniqueResult()只会返回第一条数据,可以用List<类型>()放回多条数据,返回的类型是IList<类型>


当配置好连接的配置文件和类和表的映射配置文件,插入操作就很简单了

using System;
using NHibernate.Cfg;
using Shit.Model;
using NHibernate;

namespace Shit
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration config = new Configuration();
            config.Configure();
            config.AddAssembly("Shit");//加载映射配置

            ISessionFactory sessionFactory = config.BuildSessionFactory();
            ISession session = sessionFactory.OpenSession();
            //使用类构建数据
            Config c = new Config();
            c.UserID = 5200;
            c.Name = "Chicai";
            c.Val = 8000;
            //保存对象那样保存(插入)数据库
            session.Save(c);

            session.Close();
            Console.ReadKey();
        }
    }
}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Shit"
                   namespace="Shit.Model">

  <class name="Config" table="chicai_config"><!--类名和表的对应-->
    <id name="ID" column="id" type="Int32"><!--主键的声明用id-->
      <generator class="identity"></generator><!--类名为identity表示使用数据库的自增长-->
    </id>
    <!--下面的都是属性和字段的对应了,都用property标签-->
    <property name="UserID" column="user_id" type="Int32"></property>
    <property name="Name" column="name" type="String"></property>
    <property name="Val" column="val" type="Int32"></property>
  </class>

</hibernate-mapping>

assembly 要映射的类所在的程序集

namespace 要映射的类所在的命名空间

name 类名或则是属性名(关于模型这边的)

table和column 当然是表名和字段名了(关于数据库那边的)

type 声明为NHibernate中间对应类型,具体可以查看文档

注意:映射必须出现主键(也就是要有id标签的存在),所以没有主键的表不能映射。


首先数据库下有着这么一个表:

create TABLE chicai_config(
id int PRIMARY KEY auto_increment,
user_id int not null,
name VARCHAR(60) not null,
val int not null
)

创建一个对应的类,里面的属性对应上表的字段

namespace Shit.Model
{
    class Config
    {
        //还不知道为什么要声明为virtual
        public virtual int ID { get; set; }
        public virtual int UserID { get; set; }
        public virtual string Name { get; set; }
        public virtual int Val { get; set; }
    }
}

建立映射关系,需要一个XML配置文件,命名方式为:类名.hbm.xml,必须声明文件类型为“嵌入的资源”

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Shit"
                   namespace="Shit.Model">

  <class name="Config" table="chicai_config">
    <id name="ID" column="id" type="Int32">
      <generator class="identity"></generator>
    </id>
    <property name="UserID" column="user_id" type="Int32"></property>
    <property name="Name" column="name" type="String"></property>
    <property name="Val" column="val" type="Int32"></property>
  </class>

</hibernate-mapping>

映射配置文件详解看这一篇笔记


创建连接的Xml配置文件,命名为hibernate.cfg.xml,并设置文件属性为始终复制,因为NHibernate要去程序根目录去找到它,所以命名也要正确

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property><!--数据的连接驱动MySql-->
    <!--连接字符串-->
    <property name="connection.connection_string">host=127.0.0.1;port=3306;database=chicai_note;user=root;password=;</property>

    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

在程序中建立连接

using System;
using NHibernate.Cfg;
using NHibernate;

namespace Shit
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration config = new Configuration();
            config.Configure();//解析连接的配置文件

            //创建产生连接Session的工厂
            ISessionFactory sessionFactory = config.BuildSessionFactory();
            ISession session = sessionFactory.OpenSession();//建立连接
            //利用链接session做一些数据库的操作
            session.Close();//关闭连接

            Console.ReadKey();
        }
    }
}

配置文件类Configuation在NHibernate.Cfg命名空间里,而连接工厂和连接ISession都在NHibernate命名空间。