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命名空间。