如何创建返回条件类型的方法

本文关键字:条件 类型 方法 返回 何创建 创建 | 更新日期: 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[]stringobject,因为这违背了强类型环境的全部意义,并且是以后引入错误的好方法。如果必须返回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;