1、将字符串“123456”反转
思路:首先将字符串分割成数组,split(''),然后利用数组的反序函数reverse(),最后将这个数组join掉
例如:
string str = "123456789";
string newStr = str.split('').reverse().join();
2、c#中异步与同步的区别:
同步:阻塞的
比如说张三喊李四去吃饭,李四说等会儿,张三就一直等着,一直等到李四将事情忙完了一起去吃饭
等价于
浏览器向服务器请求数据,服务器比较忙,浏览器一直等着(页面空白),直到浏览器在返回数据时才显示
异步:非阻塞的
比如说张三喊你李四吃饭,李四说知道了,然后就自己去吃饭了,李四忙完了就自己去吃饭了;
等价于
浏览器向服务器请求数据,服务器比较忙的,浏览器还是干自己的事(显示页面),去服务器将数据返回回来的时候告诉浏览器一声,浏览器把返回的数据渲染到页面,局部刷新;
3、C#是否可以对直接内存操作?
答案是:可以对内存直接操作;
为什么呢?
在C#直接对内存操作是非安全的,为什么呢?因为直接对内存操作需要有"unsafe"修饰
例如:
unsafe class MyClass{}
unsafe void Getunsafe(){}
这里问题就来了,不安全为什么还有人要用他呢?答案就是有些情况下,有些时候,还要用到指针;
那什么是指针呢?
指针是一种用来存储一种变量地址的特殊变量,如果你把一个变量地址赋给第二个变量,你可以说第一个变量指向第二个变量,CLrR支持3种指针类型:1、受托管指针;2、非托管指针;3、非托管函数指针;
受托管指针存储在堆上的托管块的引用,一个非托管指针是传统的C++指针并且每次使用必须要放在unsafe代码块中,一个非托管函数指针也是指向函数地址的传统的C++指针(delegates 可以被看做是非托管函数指针).
例如1:
unsafe
{
int* pi;
int x = 1;
pi = &x;
Console.WriteLine(*pi);
}
在上述实例中:我们声明了两个变量;一个是pi指向Int的指针,x是int类型,我们将x的地址赋给pi;理解这一点就是,我们放在pi中的变量是x的地址,而不是x的值很重要
上述编译后输出:1
指针也是可以接受Null值的,也可能是用void指针类型
unsafe
{
nt x = 10;
void* px = &x;
double *pd = (double*)px;
}
在C#中是指针一定要比C++当中使用指针一定要更加的注意,应为c#当中的垃圾回收机制会运行内存清理,在清理的过程中gc会改变对象在内存中的位置,这样就会导致指针指向错误的对象位置;为了避免这个为题,c#包含'fiexd'关键字,他告诉对象不要重新部署对象
我们已经知道了指针在C#中非常有用的部分,使用指针的并不难但是要非常小心,因为可能导致难易诊断的问题,使用指针很有可能扰乱垃圾回收机制的功能,所以当我们的程序中存在大量指针是就应该考虑考虑其他解决问题的办法了
4、静态类与非静态类的区别:
1、静态类不能被实例化,而普通类可以;
2、静态类只能从system.object继承,而不普通类除了sealed与static修饰的类都可以继承,但是也只能继承一个类;
3、静态类不能继承接口,普通类可以多继承接口;
4、静态类只能包含静态成员,而普通类既可以有静态成员也可以有非静态成员;
5、静态类不能作为字段、方法参数、局部变量的使用,普通类可以;
5、简述Ajax的执行过程
1、创建XMLHttpRequest对象,也就是创建一个异步调用的对象;
2、创建一个HTTP请求,并指定请求的方法、URL地址及验证信息;
3、设置Http状态变化的函数(即成功与失败);
4、向服务器发送Http请求;
5、获取异步请求返回的数据;
6、然后使用JavaScript将返回的数据渲染到页面上;