好的,所以我有一个char(1)类型的数据库字段,它有少量可能的状态代码(例如'F'= Failure,'U'= Unknown等).我想要一个与这些状态相对应的C#enum类.我可以:
public enum StatusCode : byte {
Unknown = (byte) 'U',
Failure = (byte) 'F',
// etc.
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是在从数据库返回的DataTable中,列值是System.Data.SqlTypes.SqlString实例.显然有一些问题从C#字符串(甚至是C#字符)转换为C#字节(因为C#char实际上是UTF-16代码点).但在这种情况下,我知道值被约束为一个小集合,如果此集合之外的值通过,代码应抛出异常.
考虑到这一点,最好的方法是什么?从SqlString转换为字节是否安全?Convert.ToByte()会更好吗?简单地使用开关/案例构造将值交叉到枚举中会更好吗?
我正在寻找"最好"的方法,不仅在获得正确的结果方面,而且在代码清晰度方面.我想我也可以使用一些常量
public const char UnknownStatus = 'U';
public const char FailureStatus = 'F';
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,我宁愿使用枚举.有什么想法吗?
编辑:为了澄清我想要做什么,我希望在我的代码中经常使用这些值.例如,我希望能够做到这样的事情:
public void DoSomething(StatusCode currentStatus) {
if(currentStatus == StatusCode.Failure) {
throw new SomeException();
}
switch(currentStatus) {
case StatusCode.Unknown:
// do something
break;
}
}
Run Code Online (Sandbox Code Playgroud)
等等.我特别想避免这样的事情:
public void DoSomething(char currentStatus) {
if(currentStatus == 'F') {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,我正在使用相当于"神奇数字"的地方.特别是,这将使迁移到其他一些状态标记系统几乎是不可能的.那有意义吗?
因此,正常的POSIX方式安全地,原子地替换文件的内容是:
fopen(3) 同一卷上的临时文件fwrite(3) 临时文件的新内容fflush(3)/ fsync(2)确保将内容写入磁盘fclose(3) 临时文件rename(2) 用于替换目标文件的临时文件但是,在我的Linux系统(Ubuntu 16.04 LTS)上,此过程的一个后果是目标文件的所有权和权限更改为临时文件的所有权和权限,默认为uid/ gid和当前umask.
我想我会stat(2)在覆盖之前将代码添加到目标文件中,并且在调用之前将fchown(2)//fchmod(2)临时文件添加到目标文件中rename,但是由于这个原因可能会失败EPERM.
是唯一的解决方案,以确保文件的uid/ gid匹配当前用户和进程组覆盖文件?在这种情况下是否有一种安全的方法可以退回,还是我们必然会失去原子保证?
我的老师教我们如何使用“exec”,但我得到了一个错误:
UnicodeDecodeError: 'cp950' codec can't decode byte 0xe6 in position 1814: illegal multibyte sequence
Run Code Online (Sandbox Code Playgroud)
我用:
exec(open("somefile.py").read())
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
是否应将某些GPL代码翻译成其他语言作为GPL许可?
例如,我们有x264 C/C++ H264编码开源GPL库.如果我们将代码作为GPL许可,我们将它从... C\C++翻译成Java或C#?
我找到了一些我不确定完全理解的旧代码.以下是仅包含JavaScript的.aspx页面:
<%@ Page Language="C#" EnableSessionState="True" CodePage="65001" uiculture="auto" %>
<%
Response.ContentType = "text/plain";
%>
var csBackgroundColor;
function testfx() {
csBackgroundColor.setAttribute('disabled', 'disabled');
}
Run Code Online (Sandbox Code Playgroud)
它被引用如下:
<script type="text/javascript" src="filename.js.aspx"></script>
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它不仅仅被标记为完全是一个JavaScript文件?是这样做的,所以你可以包括代码块?使用这种方式的文件,我甚至没有获得IntelliSense.
下面的if语句成功,并且输出s的值。但是,如果删除:和/或空格条件,则它将失败。我对为什么它首先成功感到困惑。
s="( )"
if ("if" and ":" and " ") in s:
print(s)
Run Code Online (Sandbox Code Playgroud) 我知道有:
这是我第一次在最后看到一个带有.sd的网站.究竟是什么意思,是否有一个维基解释了更多?
例如,本网站:http: //www.racingpost.com/horses2/results/home.sd
我第一次看到它,我只是好奇.
SQLite中标量SQL函数和聚合SQL函数之间的确切区别是什么?
尝试在SQLite中创建新函数时,我遇到以下代码问题:
int sqlite3_create_function(
sqlite3 *db,
const char *zFunctionName,
int nArg,
int eTextRep,
void *pApp,
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*)
);
Run Code Online (Sandbox Code Playgroud)
对于标量SQL函数,xStep且xFinal必须为null,对于聚合SQL函数,xFunc必须为null.我需要知道使用哪一个以及有什么区别.
示例代码在这里:
static class stack
{
int top=-1;
char items[] = new char[100];
void push(char x)
{
if (top == 99)
System.out.println("Stack full");
else
items[++top] = x;
}
}
Run Code Online (Sandbox Code Playgroud)
当 items[++top] 出现时到底发生了什么?