小编Sec*_*ret的帖子

C#ref是C/C++中的指针还是C++中的引用?

我正在使用ref并且不明白"它是像C/C++中的指针还是像C++中的引用一样?"

为什么我问你这么弱的问题?因为,当我正在阅读C#/.NET书籍,msdn或与C#开发人员交谈时,我会因以下原因而感到困惑:

  • C#开发人员建议不要ref在函数的参数中使用,e.g. ...(ref Type someObject)对他们没有好处,他们建议...(Type someObject),我真的不明白这个建议.我听到的原因:更好地处理对象的副本,然后将其用作返回值,而不是通过引用等来破坏内存...通常我会听到有关数据库连接对象的这种解释.就像我简单的C/C++体验一样,我真的不明白为什么使用引用是C#中的坏东西?我控制对象的生命及其内存分配/重新分配等...我在书籍和论坛中只读了建议it's bad, because you can corrupt your connection and cause a memory leak by a reference lose,所以我控制对象的生命,我可以手动控制我真正想要的东西,那为什么它不好?
  • 现在阅读不同的书籍并与不同的人交谈,我不清楚是ref一个指针(*)或像C++中的引用&吗?我记得C/C++中的指针总是分配一个大小为void*4字节的空间(有效大小取决于体系结构),其中主机是结构或变量的地址.在C++中,通过传递引用&,没有来自堆/堆栈的新分配,并且您在内存空间中使用已定义的对象,并且外部没有像在纯C中那样的指针的子分配内存.那么refC#中的内容是什么?.NET VM是否像普通C/C++中的指针一样处理它,它为指针GC分配临时空间,还是像C++中的引用那样工作?是否ref只能正确使用托管类型或者类似于值类型bool, int,更好地切换unsafe代码并以非托管样式传递指针?

c# pointers memory-management reference ref

36
推荐指数
2
解决办法
4万
查看次数

如何从被动模式获取FTP协议的端口?

当我在FTP中进入被动模式时,我得到:

227进入被动模式(213,180,204,183,230,205).

前4个数字是IP地址,但最后两个是什么?

他们是两个港口吗?

ftp port passive-mode

32
推荐指数
2
解决办法
4万
查看次数

Convert.ToBoolean失败,值为"0"

我正在尝试将value "0"(System.String)转换为其Boolean表示形式,如:

var myValue = Convert.ToBoolean("0"); // throwing an exception here
Run Code Online (Sandbox Code Playgroud)

我查看了MSDN页面,在代码示例块中,我找到了这些行:

ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在转换System.StringBoolean这样:

// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Run Code Online (Sandbox Code Playgroud)
  • 有没有其他方法转换为Boolean没有这样丑陋代码的类型?
  • 为什么会出现这种异常?因为从引用类型System.String转换为值类型System.Boolean,但System.Int32也是值类型,不是吗?

c# types reference type-conversion value-type

22
推荐指数
2
解决办法
5万
查看次数

获得比特值的BitArray比使用按位移位的简单结合更快吗?

1). var bitValue = (byteValue & (1 << bitNumber)) != 0;

2).使用System.Collections.BitArrayGet(int index)方法

  • 什么更快?
  • 在.NET项目的什么情况下,BitArray比按位移的简单连接更有用?

c# performance bit-shift bitarray logical-operators

19
推荐指数
2
解决办法
2万
查看次数

为什么难以反汇编本机Win32,但很容易拆解.NET应用程序?

为什么拆分原生Win32图像(例如用C/C++构建)的里程比拆卸.NET应用程序更困难?

主要原因是什么?因为什么?

.net c# c++ winapi native

11
推荐指数
3
解决办法
1690
查看次数

P /从C#调用C++模板<T>方法

我在C++函数中定义了外部调用:

template<typename T>
void __declspec(dllexport) SwapMe(T *fisrt, T *second)
{
    std::cout << typeid(T).name() << std::endl;

    T temp = *first;
    *first = *second;
    *second = temp;
}
Run Code Online (Sandbox Code Playgroud)

我想在C#程序中使用它.我试过这样的方式:

unsafe class Program
{
    [DllImport("lib1.dll", EntryPoint = "SwapMe")]
    static extern void SwapMe<T>(T first, T second);

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到了这样的错误:

泛型类中的通用方法或方法是内部调用,PInvoke,或者在COM Import类中定义.

似乎是,C#中的Generic是托管类型,而且在C++中使用非托管模板的架构是相当不同的东西.

如何在我的C#程序中使用模板方法?

c# c++ generics pinvoke templates

7
推荐指数
1
解决办法
1333
查看次数

来自CodeBehind的ASP.NET警报换行符

我在Page.aspx.cs文件中有这样的代码:

void btnSessionCreate_Click(object sender, EventArgs e)
{
        if (Session["user"] == null)
        {
            Session["user"] = Guid.NewGuid().ToString();
            Response.Redirect("/");
        }
        else if (Session["user"] != null)
        {
            string userBrowser = Request.UserAgent.ToString();
            string sessionId = Session["user"].ToString();

            Response.Write("<script>alert('" + sessionId + "\r\n" + userBrowser + "');</script>");
        }
 }
Run Code Online (Sandbox Code Playgroud)

主要问题是Response.Write()方法中的"\ r \n"部分.我想用换行符分隔数据,但不能!

如果没有"\ r \n",脚本会很好地发出警报,但如果代码中存在则没有任何警报,并且正在更改重置其CSS样式.

为什么?

javascript asp.net alert newline

6
推荐指数
1
解决办法
7279
查看次数

如何正确使用AUTHENTICATE PLAIN连接IMAP?

我正在使用OpenSSL连接到邮件服务器.

POP3工作正常但我有IMAP问题.基于CAPABILITY命令服务器支持PLAIN,NTLM和GSS-API身份验证方法.

我想使用PLAIN,因为它比其他人更容易.我已经读过它需要使用<NUL>它.

我已经运行了下一个版本,但没有成功:

? login user pass
? login <nul>user<nul>pass
? <nul>login <nul>user<nul>pass
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

imap

5
推荐指数
2
解决办法
2万
查看次数

使用不安全的C#进行Perversion,内存堆栈分配

在这里,我正在尝试使用C#的不安全功能:http://ideone.com/L9uwZ5

我知道,在C#中这样的方式是最糟糕的,我想承认,主题中有一些信息.看看"变态"这个词.

我想在C#中实现快速排序,如pure-C方式(甚至不是C++).它可能很疯狂,但只是想深入了解不安全的C#的可能性.

我一直在尝试使用stackalloc运算符.我知道,这是来自堆栈的分配,而不是来自堆的分配,这就是我执行程序失败的原因.

但是当我在这个程序中没有看到任何异常/错误时我很困惑.

  • 为什么我没有得到任何明确的例外/错误?

另外,正如您所看到的代码的注释部分:

struct Header
{
    internal int* data;
};

Header* object_header = stackalloc Header[sizeof(Header)];
object_header->data = stackalloc int[length];
Run Code Online (Sandbox Code Playgroud)

我无法用最后一行编译它.C#编译器告诉我,在这个表达式中无法使用stackalloc.为什么?data是int*类型,为什么会出现错误?

我只想使用堆栈框架而不是使用堆.我知道,还有另一种方法,但它是来自堆的分配.

int*[] data = new int*[length * sizeof(int)];
IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(length * sizeof(int)));
Marshal.WriteInt32(result, 0);
for(int i = 0; i < length * sizeof(int); i++) d[i] = (int*)result;
Run Code Online (Sandbox Code Playgroud)

例如,但它不是堆栈分配.

我怎么能用C#语言中的stack-allocation和pure-C style语法显式地解决我的perversion任务.

C#不是为这样的目标而创建的,而且这些功能很愚蠢 - 我知道,但主要的问题不是重要性,而是关于这些功能.

c# pointers memory-management unsafe marshalling

5
推荐指数
1
解决办法
1410
查看次数

C#确实var有一个强类型?

如链接:http://msdn.microsoft.com/en-us/library/bb383973.aspx

...隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但编译器确定类型 ...

但我有这样的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["user"] == null) Response.Redirect("Default.aspx");

        StringBuilder sb = new StringBuilder();

        foreach (var item in Session)
        {
            sb.Append("Session Parameter: [");
            sb.Append(item);
            sb.Append("]<p />Guid Value: [");
            sb.Append(Session[item] + "]");
        }

        Response.Write(sb.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

我在Visual Studio中遇到这样的错误:

参数1:无法将"对象"转换为"字符串":

 sb.Append(Session[item] + "]");
Run Code Online (Sandbox Code Playgroud)

但是item在运行时将其识别string为我在调试器中查看的类型.

当我var在msdn /书中阅读时,我认为这var与RTTI的东西无关.编译器只是string, int在编译时使用此类隐式类型更改变量,类似于etc.

为什么我会抓到这样的错误?

c# var runtime rtti type-conversion

4
推荐指数
1
解决办法
297
查看次数