从函数返回2个变量到main [英] return 2 variables from function to main

查看:76
本文介绍了从函数返回2个变量到main的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我正在处理一个上传图片,正如您在我的代码中看到的那样,如果图片太大,我会调整图片的大小.我想从resizeImage方法中传回以下变量:maxwidth,maxheight和newBMP的文件大小.我知道我可以用完参数,但是我不确定如何实现此技术,有人可以帮我吗?
这是我的代码:

Hi everyone, I''m working with an upload image and as you can see with my code I''m resizing the image if it''s too big. I''d like to pass back from the resizeImage method the following variables: maxwidth, maxheight and the filesize of the newBMP. I know I can use out parameters but I''m not sure how to implement this technique, can someone help me please?
Here''s my code:

//Save Cylinder Image File;
            if (BrowserHidden.HasFile)
            {                
                strFileExtension = Path.GetExtension(BrowserHidden.FileName);
                strFileName = "cylinder-" + gvCylinderData.DataKeys[gvCylinderData.SelectedIndex].Values["CylinderID"] + strFileExtension;
                //Is the file type valid?
                if ((strFileExtension == ".jpg") || (strFileExtension == ".jpeg") || (strFileExtension == ".gif") || (strFileExtension == ".png"))
                {
                    if (!Directory.Exists(strFolderPath))
                    {
                        //create the new folder if it doesn't already exist
                        Directory.CreateDirectory(strFolderPath);
                    }

                    resizeImage(strFolderPath, strFileName); //i'd like to return the variable from this method

                    imgCurrentLogo.ImageUrl = "~/Admin/Images" + "/" + strFileName;
                }
                else
                {
                    lblUploadImage.Visible = true;
                    lblUploadImage.Text = "You must pick a jpg, jpeg, gif or png file";
                    txtLogo.Text = "";
                    txtPDFDatasheetPath.Text = "";
                    return;
                }

                Bitmap origBMP = new Bitmap(BrowserHidden.FileContent);
                string imgheight = "100";
                string imgwidth = "100";
                int fileSize = BrowserHidden.PostedFile.ContentLength;

                int maxwidth = int.Parse(imgwidth);
                int maxheight = int.Parse(imgheight);
                //Is the file too big to upload?
                if ((origBMP.Width > maxwidth) || (origBMP.Height > maxheight))
                {
                    lblUploadImage.Visible = true;
                    lblUploadImage.Text = "Image height x width is invalid: 100px(h) x 100px(w)";
                    txtLogo.Text = "";
                    txtPDFDatasheetPath.Text = "";
                    return;
                }
                //Is the file > 200KB?
                else if (fileSize > 204800)
                {
                    lblUploadImage.Visible = true;
                    lblUploadImage.Text = "File size exceeds maximum limit 200KB.";
                    txtLogo.Text = "";
                    txtPDFDatasheetPath.Text = "";
                    return;
                }
            }

public void resizeImage(string FolderPath, string FileName)
        {
            string fName, trgDir;
            trgDir = FolderPath;
            fName = FileName;

            Bitmap origBMP = new Bitmap(BrowserHidden.FileContent);
            string tempwidth = "100";
            string tempheight = "100";
            int maxwidth = int.Parse(tempwidth);
            int maxheight = int.Parse(tempheight);
            if (origBMP.Width <= maxwidth)
            {
                origBMP.Save(trgDir + fName);
                return;
            }
            else
            {
                int origWidth = origBMP.Width;
                int origHeight = origBMP.Height;
                int newWidth = maxwidth;
                int newHeight = maxheight; //newWidth * origHeight / origWidth;

                Bitmap newBMP = new Bitmap(origBMP, newWidth, newHeight);
                Graphics objGra = Graphics.FromImage(newBMP);               
                objGra.DrawImage(origBMP, new Rectangle(0, 0, newBMP.Width, newBMP.Height), 0, 0, origWidth, origHeight, GraphicsUnit.Pixel);
                objGra.Dispose();
                newBMP.Save(trgDir + fName);
            }
        }

推荐答案

而不是使用out参数(故意笨拙),而不是返回一个类(或struct),该类给出有关已采取措施的信息?这样可以将所有信息保持在一起
然后,如果没有更改,它可以返回一个实例,或者返回null而不是void.或更妙的是,将其中一个属性设置为bool,以指示图像是否已调整大小,并始终返回实例.
Rather than using out parameters (which are deliberately clumsy), why not return a class (or struct) which gives info about the actions taken? This keeps all the info together
Then instead of a void it could return an instance or null if no change has taken place. Or better, make one of the properties a bool which indicates if the image has been re-sized, and always return an instance.


您可以使用Ref关键字:

例如
You can use Ref keyword :

e.g.
class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int. 
            // The following statement would cause a compiler error if i 
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }



还是关键字:



Or out Keyword:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}



如果您有多个相同类型的值&您想从方法中返回它,则可以使用数组作为该方法的返回类型:)



If you have multiple values of same type & you want return it from method, you can use array as a return type for that method :)


Quote:

公共无效的resizeImage(字符串FolderPath,字符串FileName)

public void resizeImage(string FolderPath, string FileName)



更改为



Change to

public void resizeImage(string FolderPath, string FileName, out int maxwidth, out int maxheight, out long filesize)




然后这样称呼:




and then call it this way:

//...
int maxwidth;
int maxheight;
long filesize;

resizeImage(strFolderPath, strFileName, out maxwidth, out maxheight, out filesize);


这篇关于从函数返回2个变量到main的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆