我正在使用ref
并且不明白"它是像C/C++中的指针还是像C++中的引用一样?"
为什么我问你这么弱的问题?因为,当我正在阅读C#/.NET书籍,msdn或与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中那样的指针的子分配内存.那么ref
C#中的内容是什么?.NET VM是否像普通C/C++中的指针一样处理它,它为指针GC
分配临时空间,还是像C++中的引用那样工作?是否ref
只能正确使用托管类型或者类似于值类型bool, int
,更好地切换unsafe
代码并以非托管样式传递指针?当我在FTP中进入被动模式时,我得到:
227进入被动模式(213,180,204,183,230,205).
前4个数字是IP地址,但最后两个是什么?
他们是两个港口吗?
我正在尝试将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.String
为Boolean
这样:
// 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
也是值类型,不是吗?1). var bitValue = (byteValue & (1 << bitNumber)) != 0;
2).使用System.Collections.BitArray
与Get(int index)
方法
为什么拆分原生Win32图像(例如用C/C++构建)的里程比拆卸.NET应用程序更困难?
主要原因是什么?因为什么?
我在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#程序中使用模板方法?
我在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样式.
为什么?
我正在使用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)
我究竟做错了什么?
在这里,我正在尝试使用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#不是为这样的目标而创建的,而且这些功能很愚蠢 - 我知道,但主要的问题不是重要性,而是关于这些功能.
如链接: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# ×7
c++ ×2
pointers ×2
reference ×2
.net ×1
alert ×1
asp.net ×1
bit-shift ×1
bitarray ×1
ftp ×1
generics ×1
imap ×1
javascript ×1
marshalling ×1
native ×1
newline ×1
passive-mode ×1
performance ×1
pinvoke ×1
port ×1
ref ×1
rtti ×1
runtime ×1
templates ×1
types ×1
unsafe ×1
value-type ×1
var ×1
winapi ×1