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