如何创建返回条件类型的方法
本文关键字:条件 类型 方法 返回 何创建 创建 | 更新日期: 2023-09-27 18:33:23
我在我的一个项目中有一个方法,如果我的图片盒包含图像,它会重新调整 byte[]。而我想以这样一种方式转换它,如果图片框中没有图片,它应该返回字符串 = "NULL",否则它应该返回 bute[]。我该怎么做??
private byte[] GetPic()
{
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
注意:我在其中插入图像的列如下
CREATE TABLE [dbo].[Students]
([Photo] [image] NULL)
在我目前的条件下,我将图像插入我上面提到的列中,即学生.照片像这样
if (pictureboxstupic.Image == null)
{
cmd.Parameters.Add("@Photo", SqlDbType.VarChar).Value = "NULL";
}
else
{
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic();
}
你可以总是返回对象并将其转换为你期望的类型 - 但这不是一个好主意。最好在调用方法之前检查 pictureboxstupic 是否为空,然后执行正确的逻辑(例如分配"NULL"(。
您也可以将类似的语义应用于 TryParse - 也就是说,如果 pictureboxstupic 不为空,您可以返回 bool 会回答,并返回字节数组作为 out 参数。
@empi的答案是正确的,我想扩展一下:方法和函数应具有一组严格定义的职责。对于GetPic
方法,它是获取图像的字节流。这应该是该方法中封装的逻辑的范围。
在某些错误框中显示单词"NULL"不是GetPic
的责任。这是调用它的人的责任,并负责显示图像或错误消息。这就是为什么我认为GetPic
如果接收到没有图像是合理的条件,应该返回null
,或者如果它是破坏程序流的真正错误条件,甚至可能抛出异常。
在任何情况下,您都不应该返回一个可以byte[]
或string
的object
,因为这违背了强类型环境的全部意义,并且是以后引入错误的好方法。如果必须返回byte[]
或string
,则可以按照其他人的建议使用ref/out
参数,也可以创建一个名为 ImageData
的新类,或者其他任何包含字节和错误消息的类,您可以使用它们来检索其中一个。
--编辑
经过你的澄清,我仍然会坚持我的答案。你不应该那样做。数据库支持的 NULL 值与字符串"NULL">不同。与其插入此字符串,不如确保列可为空,并插入空值 - DBNull.Value
。当前代码将崩溃,因为"照片"列无法处理 VarChar 值。
返回object
?然后通过首先使用 is
关键字检查类型来强制转换。
if(returnedType is string) //or use as and then check for NULL
{
}
else //type is byte[]
{
}
不确定您的用例以及它是否有效,但这可能是一个解决方案
您可以通过三种解决方案来实现:
1.( 使用对象作为返回类型
2.( 使用"ref"和"out"参数说明符返回数组,并使方法返回类型字符串以返回状态消息。
3.( 使用"不安全"代码作为指针...
例:
public string GetPic(out byte[] ret)
{
if (Image == null)
return "NULL";
//set ret's value as image bytes
return "ok";
}
这样做:
//call the method:
string str = ""; //variable that will be changed accordingly by returned value
byte[] image = GetPic();
if (image.Length == 0)
{
//do what ever you want, like string = "NULL":
str = "NULL";
}
//
//
private byte[] GetPic()
{
PictureBox pictureboxstupic = new PictureBox();
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
我这样解决了我的问题方法:
private object GetPic()
{
if(pictureboxstupic.Image == null)
{
return null;
}
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
用法:
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic() ?? DBNull.Value;